I have a class with two instance attributes. For example:
class Test():
def __init__(self, parameter):
self.one = self.somefunction(parameter)
self.two = 'somestring'
In the same class I define a function somefunction which will, accordingly to the above coding, be called at the time the object is created. While I tried this, I could set self.one when I return some value inside my somefunction(parameter), like:
def somefunction(parameter):
return ...
However, this doesn't feel like best practice.What's the best way to set an initial value of an instance dynamically?
1 Answer 1
There's nothing wrong with what you've done, unless somefunction takes a long time to return. As a rule, you don't normally want object creation/instantiation to take a long time. If it takes a long time to calculate that attribute you should do it the first time the attribute is accessed. And that can be done with property getters.
import time
class Foo(object):
def __init__(self, parameter):
self._one = None
self.two = "some_string"
self._parameter = parameter
@property
def one(self):
if self._one is None:
self.one = self._some_method()
return self.one
def some_method(self):
time.sleep(10)
return sorted(self._parameter)
When you call foo.one Python will check to see if "protected" attribute is still None. If it is, then it will do the expensive function call. The next time you try to access it, it will use the saved value.
__init__rather thaninit, ie a constructor for theTestclass.)