one-time initialization of class members
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Jun 13 21:18:04 EDT 2007
En Wed, 13 Jun 2007 22:03:50 -0300, Steven D'Aprano
<steve at REMOVE.THIS.cybersource.com.au> escribió:
> On Wed, 13 Jun 2007 23:55:02 +0000, James Turk wrote:
>>> James Turk wrote:
>>>
>>> > I have a situation where I have some class members that should only
>>> be
>>> > done once. Essentially my problem looks like this:
>>>
>> ChildClass doesn't take the parameter in it's constructor, it supplies
>> it for the BaseClass. Every ChildClass of the same type should use
>> the same dataset.
>
> Then each type of ChildClass should be a sub-class, and provide it's own
> dataset:
>
>
> class BaseClass:
> dataset = None
> # blah blah blah...
>
>
> class ChildClass1(BaseClass):
> dataset = SomethingUseful
> class ChildClass2(BaseClass):
> dataset = SomethingElse
But the OP also stated that creating the dataset is expensive. The
original code does what you say (each ChildClass is a subclass and
provides its own dataset) so I think is an acceptable solution:
py> def build_dataset(x):
... print "building dataset:",x
... return [x]
...
py> class Base(object):
... dataset = None
... def __init__(self, param):
... if type(self).dataset is None:
... type(self).dataset = build_dataset(param)
...
py> class ChildClass1(Base):
... def __init__(self):
... Base.__init__(self, "Params for ChildClass1")
...
py> class AnotherChildClass(Base):
... def __init__(self):
... Base.__init__(self, "Params for AnotherChildClass")
...
py> c1 = ChildClass1()
building dataset: Params for ChildClass1
py> c2 = AnotherChildClass()
building dataset: Params for AnotherChildClass
py> c3 = ChildClass1()
py> print Base.dataset
None
py> print ChildClass1.dataset
['Params for ChildClass1']
py> print AnotherChildClass.dataset
['Params for AnotherChildClass']
py> print c1.dataset
['Params for ChildClass1']
py> print c3.dataset
['Params for ChildClass1']
py> print c1.dataset is c3.dataset
True
py>
--
Gabriel Genellina
More information about the Python-list
mailing list