从类内部指派类变量动态值(Assigning class variable dynamic valu

2019-10-17 01:12发布

我想从一个类的内部动态分配类变量的值。

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'

有没有办法做到这一点? 还是有更好的方式来处理呢?

Answer 1:

类套房评估从上到下,和你所定义的类不存在,直到整个套件后评估。

你可以把函数定义的类体中,但你必须把它它被定义之后,而不是之前。 因此,这将工作:

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'

这只能是一个类的实例访问时评价,但是属性对象本身就存在于类。



Answer 2:

我想补充马特·安德森的答案 - 用类物业的解决方法:

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'


文章来源: Assigning class variable dynamic value from inside a class