calling superclass' method with list positional arg
Roeland Rengelink
r.b.rigilink at chello.nl
Fri Apr 13 06:30:41 EDT 2001
Steven Haryanto wrote:
>
> My Bag's constructor accepts a list positional args to fill
> the object with initial data, so I can conveniently create
> a bag initially filled with stuff like this:
>
> mybag = Bag("apples", "oranges", "money")
>
> BagOTricks is a subclass of Bag, and it needs to do something
> else but let the superclass do the actual data filling.
> Currently I do it like this:
>
> class Bag:
>
> def __init__(self, *items):
> self._items = list(items)
>
> def add(self, item):
> self._items.append(item)
>
> class BagOTricks(Bag):
>
> def __init__(*args):
> self = args_[0]
> # do something else first...
>
> # then pass the items to superclass' constructor
> apply(Bag.__init__, args_)
>
> Is there an elegant way to do this so I can still declare
> Bag's __init__ as 'def __init__(self, *items)', but I don't
> need to create a temporary list like below?
>
> class BagOTricks(Bag):
>
> def __init__(self, *items):
> # do something else first...
>
> # then pass the items to superclass' constructor
> args = list(items)
> args.insert(0, self)
Shouldn't that args be a tuple: i.e: args = (self,)+items ?
> apply(Bag.__init__, args)
>
> Thanks,
> Steve
I may misunderstand the question, but maybe this is what you mean
(Python 2.0+)
class BagOTricks(Bag):
def __init__(self, *items):
# do something else
Bag.__init__(self, *items)
If you're using 1.5.* and want to avoid the copies, the __init__(*args)
method
seems like the best approach On the other hand. why worry about the
copies, the
__init__ is not going to take that many arguments is it?
Or just not call Bag.__init__. but do the assignment in BagOTricks
itself.
Hope this helps,
Roeland
More information about the Python-list
mailing list