2017-07-18 90 views
3
class Test(object): 

    def __init__(self): 
     pass 

    def testmethod(self): 
     # instance method 
     self.task(10)  # type-1 access class method 

     cls = self.__class__ 
     cls.task(20)  # type-2 access class method 

    @classmethod 
    def task(cls,val) 
     print(val) 

我有兩種方法可以將類方法訪問成實例方法。訪問類方法到實例方法的最佳方法

self.task(10) 

cls = self.__class__ 
cls.task(20) 

我的問題是哪一個是最好的,爲什麼?

如果兩種方式不一樣,那麼我使用哪一種條件?

+5

您也可以直接在該方法內直接調用'Test.task(20)'而不是雙線程。 – xgord

+2

@xgord:是的,但這兩個是*不相等。 'Task.task(20)'將總是調用'Task'中定義的'task',而一個*子類*可以覆蓋該方法。在這種情況下,'SubTask'類中的'self.task(20)'將訪問'SubTask.task(20)'。 –

+1

這取決於預期用途 - 'self'將始終引用當前實例的方法,並且不僅通過繼承鏈持久化(與通過類名調用相比,即'Test.task()'),最新的覆蓋,即使是動態的,但通過類類型引用將始終指向實際的類方法。沒有什麼能阻止你設置'your_instance.task = some_dynamic_override',然後'self.task()'將調用該函數。 – zwer

回答

2

self.task(10)絕對是最好的。

首先,兩者都將在相同的操作,最終結束對類實例:

類實例
...
特殊屬性:__dict__是屬性字典; __class__是實例的類

  • 調用具有一個類的實例對象類方法實際上是類的對象傳遞給該方法(參考文獻:參考文獻說明書的同一章):

...當通過從類或實例中檢索類方法對象來創建實例方法對象時,其__self__屬性是類本身

但是,第一個i更簡單並且不需要使用特殊的屬性。