1

我正在尝试从类内部动态地为类变量分配一个值。

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 包含此方法,因此我尝试将其设置为 a@classmethod和 a@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'

有没有办法做到这一点?或者有没有更好的方法来处理这个?

4

2 回答 2

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'

这只会在类实例上访问时进行评估,但属性对象本身将存在于类中。

于 2012-07-22T13:52:44.953 回答
0

只是添加到马特安德森的答案 - 使用类属性的解决方法:

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'
于 2012-07-22T14:14:37.883 回答