list as an instance attribute
Bruno Desthuilliers
bruno.42.desthuilliers at websiteburo.invalid
Mon Sep 14 04:36:18 EDT 2009
Daniel Santos a écrit :
> Here goes,
>
> I have a base class that is the following :
>
> class primitive:
pep08 : class names should be Capitalized.
Also, if you're using Python 2.x, make it:
class Primitive(object):
#...
>
> def __init__(self):
> self.name = ""
> self.transforms = []
>
> def copyInternalState(self, sourceObj, copyName):
pep08 : methods, attributes and variables names should be all_lower
> return null
s/null/None/g
>
> def copy(self, copyName):
>
> # copy the source object internal state
> primitiveCopy = self.copyInternalState(self, copyName)
>
> # copy the transformations
> primitiveCopy.transforms = []
If copyInternalState is supposed to return an instance of a
(well-behaved) subclass of 'primitive' - or any object conforming to the
(implicit) 'primitive' interface, you shouldn't have to do this.
> if self.transforms != []:
An empty list has a false value in a boolean test, so the above test
would be better written as :
if self.transforms:
But anyway, the whole test is plain useless:
for item in []:
print "you won't see me"
> for transf in self.transforms:
> primitiveCopy.transforms.append(transf.copy())
>
> return primitiveCopy
>
> # more methods. the ones listed should be enough to get the picture
>
> And a derived class,
>
> class CircularCilinder(primitive):
>
>
> def __init__(self, name):
>
> self.name = name
> self.baseCenterVertex = [0, 0, 0]
> self.heightVertex = [0, 1, 0]
> self.radius = 1
You're not calling the __init__ method of primitive. Your code here
should be:
def __init__(self, name):
super(CircularCilinder, self).__init__(name)
self.baseCenterVertex = [0, 0, 0]
self.heightVertex = [0, 1, 0]
self.radius = 1
> def copyInternalState(self, sourceObj, copyName):
>
> copy = CircularCilinder(copyName)
>
> copy.setHeight(self.heightVertex[1])
> copy.setRadius(self.radius)
Python is not Java. We have good support for computed properties, so you
*don't* need explicit getters/setters - just start with a plain
attribute access, you can always turn it into a computed one latter if
and when the need arises.
> return copy
>
>
> I then have a script that creates a CircularCilinder,
>
> cilinder = CircularCilinder("cilinder")
> cilinderCopy = cilinder.copy("cilinderCopy")
>
>
> when I run this script I get the error,
>
> Traceback (most recent call last):
> File "./testscript.py", line 26, in <module>
> cilinderCopy = cilinder.copy("cilinderCopy")
> File "/cygdrive/d/cg/brlcad_api/trunk/src/ds_brlcad_modeler/api/primitive.py",
> line 64, in copy
> if self.transforms != []:
> AttributeError: CircularCilinder instance has no attribute 'transforms'
Indeed - you didn't call the superclass's __init__
>
> the transforms instance attribute is not known in the derived class. But I
> wanted to avoid adding a self.transforms = [] line to the derived class
> __init__ method.
Should be the same wrt/ the 'name' attribute FWIW.
HTH
More information about the Python-list
mailing list