[Tutor] list of instance objects, access attribute
Lie Ryan
lie.1296 at gmail.com
Sat Jun 20 00:30:07 CEST 2009
Alan Gauld wrote:
>
> "Vincent Davis" <vincent at vincentdavis.net> wrote
>
> class B():
> def __init__(self, b1, b2):
> self.fooa = b1
> self.foob = b2
>
> I assume thats what you really meant!
>
> Ok now I have several instances in a list
> b1 = B(1, 2)
> b2 = B(3, 4)
> b3 = B(9, 10)
> alist = [b1, b2, b3]
>
>> Lets say for each instance of the class I want to print the value of
>> fooa if it is greater than 5. How do I do this,
>
> define a method of the class, say bigprint()
>
> def bigprint(self, limit=5):
> if self.fooa > limit: print self.fooa
>
>> about is how I iterate over the values of fooa.
>
> Iterate over the objects and call the method. Make the object do the
> work, your code should not need to know about the internal attributes of
> the object.
>
> For x in alist:
> x.bigprint()
>
>> Is that the right way or is there a better?
>> will this work for methods?
>
> Methods are how you should do it. Direct access other than for simple
> reading of values is a suspicious design smell. Any processing of or
> rules about the data should be in a method.
>
>
Personally, I often thought input/output inside an object is a design
smell (except for debugging), preferring something like this:
class B(object):
def __init__(...):
...
def big(self, limit=5):
return (self.fooa > limit)
alist = [...]
for y in (x for x in alist if x.big()):
print y.fooa
although admittably often it could make certain codes more difficult to
write; and in some cases the practical approach would be warranted. This
is especially true as the codebase gets larger.
More information about the Tutor
mailing list