[Tutor] Populating a list with object to be called by a class
eryksun
eryksun at gmail.com
Thu Sep 20 18:25:35 CEST 2012
On Thu, Sep 20, 2012 at 10:41 AM, Ara Kooser <ghashsnaga at gmail.com> wrote:
>
> I have a list that tracks the ants but I did this is a very crude way. I
> basically copied and pasted everything in there like this:
>
> ants =
> [Ant("Red_1","Red","yellow_food"),Ant("Yellow_1","Yellow","red_food"),
> Ant("Red_2","Red","yellow_food"),Ant("Yellow_2","Yellow","red_food"),
Having the type as instance data is limiting. Consider creating the
subclasses RedAnt and YellowAnt, instead. For example, "red_food" can
be a default argument for YellowAnt. You can also use a class counter
variable that gets incremented for each new ant. Then the names can be
automatic, too, but with the option to use a specific name.
class Ant(object):
_count = 0
def __init__(self, name=None, food='food'):
cls = self.__class__
if cls == Ant:
raise NotImplementedError
cls._count += 1
if name is None:
self.name = "%s_%s" % (cls.__name__, cls._count)
else:
self.name = name
self.food = food
def __repr__(self):
clsname = self.__class__.__name__
name = repr(self.name)
food = repr(self.food)
return "%s(%s, %s)" % (clsname, name, food)
def __str__(self):
return str(self.name)
class RedAnt(Ant):
def __init__(self, name=None, food="yellow_food"):
super(RedAnt, self).__init__(name, food)
class YellowAnt(Ant):
def __init__(self, name=None, food="red_food"):
super(YellowAnt, self).__init__(name, food)
For example:
>>> ants = [cls() for i in range(2) for cls in (RedAnt, YellowAnt)]
>>> ants
[RedAnt('RedAnt_1', 'yellow_food'), YellowAnt('YellowAnt_1', 'red_food'),
RedAnt('RedAnt_2', 'yellow_food'), YellowAnt('YellowAnt_2', 'red_food')]
>>> print ', '.join(str(a) for a in ants)
RedAnt_1, YellowAnt_1, RedAnt_2, YellowAnt_2
>>> Ant()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 8, in __init__
NotImplementedError
>>> RedAnt('Tom', 'mice')
RedAnt('Tom', 'mice')
>>> YellowAnt('Jerry', 'cheese')
YellowAnt('Jerry', 'cheese')
>>> RedAnt._count, YellowAnt._count, Ant._count
(3, 3, 0)
More information about the Tutor
mailing list