I have a class with a complex data member that I want to keep "static". I want to initialize it once, using a function. How Pythonic is something like this:
def generate_data():
... do some analysis and return complex object e.g. list ...
class Coo:
data_member = generate_data()
... rest of class code ...
The function generate_data
takes a long while to complete and returns data that remains constant in the scope of a running program. I don't want it to run every time class Coo is instantiated.
Also, to verify, as long as I don't assign anything to data_member
in __init__
, it will remain "static"? What if a method in Coo appends some value to data_member
(assuming it's a list) - will this addition be available to the rest of the instances?
Thanks
You're right on all counts.
data_member
will be created once, and will be available to all instances ofcoo
. If any instance modifies it, that modification will be visible to all other instances.Here's an example that demonstrates all this, with its output shown at the end:
As others have answered you're right -- I'll add one more thing to be aware of: If an instance modifies the object
coo.data_member
itself, for examplethen the modification is seen by the rest of the instances. However if you do
then a new instance member is created which overrides the class member and is only visible to that instance, not the others. The difference is not always easy to spot, for example
self.data_member += 'foo'
vs.self.data_member = self.data_member + 'foo'
.To avoid this you probably should always refer to the object as
coo.data_member
(not throughself
).The statement
data_member = generate_data()
will be executed only once, whenclass coo: ...
is executed. In majority of cases class statements occur at module level and are executed when module is imported. Sodata_member = generate_data()
will be executed only once when you import module with classcoo
for the first time.All instances of
coo
class will sharedata_member
and can access it by writingcoo.data_member
. Any changes made tocoo.data_member
will be immediately visible by anycoo
instance. An instance can have its owndata_member
attribute. This attribute can be set by typingself.data_member = ...
and will be visible only to that instance. The "static"data_member
can still be accessed by typingcoo.data_member
.