2016-08-24 19 views
0

在Python 2.7,定義一個類時,怎樣才能在類的層次限定如何在類級別或實例對象級別定義類的成員函數?

  • 成員函數,即,它的第一個參數是類對象,而不是類的實例對象

  • 成員函數在類的實例對象級別,即它的第一個參數是類的實例對象,而不是類對象。

當使用給定的類時,如何判斷成員函數是處於類的級別還是處於類實例對象的級別?

例如,在Python標準庫,從該TestCasesetUp()被調用的TestCase,即在實例對象的級別每個實例對象,而 類級別燈具在TestSuite實現。當測試套件遇到來自新類別的測試時,則從先前類別(如果有的話)中調用tearDownClass(),然後從從 新類別。

謝謝。

+1

你在找@classmethod? – galaxyan

+0

謝謝。也許。在Python官方網站的某些文檔中提到'@ classmethod'時,一般討論類和實例對象?我在Python語言參考和Python教程中找不到'@ classmethod'。 – Tim

+0

https://docs.python.org/3/library/functions.html#classmethod。它們也在本節的最後幾段中提到 - https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy。 ...還檢查該鏈接的「實例方法」標題。 – wwii

回答

2

@classmethod窗體是一個函數裝飾器 - 有關詳細信息,請參閱函數定義中關於函數定義的說明 。它可以在類(如C.f())或實例 (如C()。f())上調用。該實例被忽略,除了它的類。如果爲派生類調用 類方法,則派生類對象 將作爲隱含的第一個參數傳遞。

類方法與C++或Java靜態方法不同。如果您想要這些,請參閱本節中的staticmethod()。

有關類方法的更多信息,請參閱標準類型層次結構中標準類型層次結構的文檔 。

https://docs.python.org/2/library/functions.html#classmethod

class A: 
... message = "class message" 
... 
... @classmethod 
... def classLevel(cls): 
...  print(cls.message) 
... 
... def instanceLevel(self, msg): 
...  self.message = msg 
...  print(self.message) 
>>> a= A() 
>>> a.instanceLevel('123') 
123 
>>> A.classLevel() 
class message 
>>> a.classLevel() 
class message 
>>> A.instanceLevel() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method instanceLevel() must be called with A instance as first argument (got nothing instead) 


    A.__dict__ 
{'classLevel': <classmethod object at 0x4E974BB0>, '__module__': '__main__', 'instanceLevel': <function instanceLevel at 0x550C8530>, 'message': 'class message', '__doc__': None} 
相關問題