2012-07-22 62 views
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() 

我想测试包含这种方法,所以我已经尝试过了既有@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

类套件从上到下进行评估,并且在定义整个套件之后,您所定义的类才会存在。

您可以将函数定义放入类体中,但必须在定义之后调用它,而不是之前。因此,这将起作用:

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' 

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

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'