我正在尝试从类内部动态地为类变量赋值。
class Test:
dynamic_value = get_dynamic_value()
我相信get_dynamic_value()
应属于Test
类。有没有办法让Test
包含此方法?
现在我正在使用它正在运作
def get_dynamic_value():
return 'my dynamic value'
class Test:
dynamic_value = get_dynamic_value()
我希望Test包含此方法,因此我尝试将其设为@classmethod
和@staticmethod
并通过
class Test:
dynamic_value = Test.get_dynamic_value()
@staticmethod
def get_dynamic_value():
return 'dynamic'
但是当我使用静态方法尝试它时,我会收到
AttributeError: class Test has no attribute 'get_dynamic_value'
有没有办法做到这一点?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:2)
类套件从上到下进行评估,直到评估整个套件之后,您定义的类才不存在。
你可以把函数定义放在类体中,但是你必须在定义之后调用它,而不是之前。所以,这将有效:
class Test:
def get_dynamic_value():
return 'dynamic'
dynamic_value = get_dynamic_value()
不需要将函数标记为静态方法;它根本不用作方法,只是在类套件评估期间调用的函数。如果您不希望在定义类之后该函数可用(因为它不是作为方法),则可以将其删除。
class Test:
def get_dynamic_value():
return 'dynamic'
dynamic_value = get_dynamic_value()
del get_dynamic_value
如果值确实应该是动态计算的,那么每次你要求它(因此它可以从访问权限更改为访问权限),那么你应该使用属性。
class Test:
@property
def dynamic_value(self):
return 'dynamic'
只有在类实例上访问时才会对此进行求值,但属性对象本身将存在于类中。
答案 1 :(得分:0)
添加到Matt Anderson的答案 - 与类属性的解决方法:
class classproperty(property):
def __get__(self, cls, owner):
return classmethod(self.fget).__get__(None, owner)()
class Test:
@classproperty
def dynamic_value(cls):
return 'dynamic'
一个简单的测试:
In [102]: Test.dynamic_value
Out[102]: 'dynamic'