从类内部分配类变量动态值

时间:2012-07-22 13:36:07

标签: python oop static

我正在尝试从类内部动态地为类变量赋值。

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'

有没有办法做到这一点?或者有更好的方法来解决这个问题吗?

2 个答案:

答案 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'