我想从一个类的内部动态分配类变量的值。
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()
我想测试包含这种方法,所以我已经试图使它既是@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'
有没有办法做到这一点? 还是有更好的方式来处理呢?
类套房评估从上到下,和你所定义的类不存在,直到整个套件后评估。
你可以把函数定义的类体中,但你必须把它它被定义之后,而不是之前。 因此,这将工作:
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'
这只能是一个类的实例访问时评价,但是属性对象本身就存在于类。
我想补充马特·安德森的答案 - 用类物业的解决方法:
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'