2012-07-22 71 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'