2012-08-01 79 views
8

這是一個學術問題,不僅僅是一個實際問題。我試圖深入研究Python的基礎,並且我想知道:如果我願意,我可以在純Python中實現staticmethodclassmethod裝飾器嗎?靜態方法和類方法裝飾器可以在純Python中實現嗎?

對於staticmethod也許我可以保留對原始函數的引用並將其稱爲省略第一個參數?

對於classmethod也許我可以保留對原始函數的引用並將其稱爲傳遞第一個參數的類型,而不是參數本身? (我將如何處理它直接在課堂上被調用?)

同樣,這不是我想要在我的程序中實際實現它;我想了解它的語言是如何工作的。如果可以這樣做,我會非常感激代碼示例。如果沒有,我會理解爲什麼它不能在理論上做的解釋。謝謝!

編輯:感謝您的答案和參考描述符協議!至於進一步擴大我的Python的理解的一種手段,我想請教兩個更多的事情:通過實現__ __電話在我們班級的特殊方法

  • 會這樣做沒有描述協議,例如?

  • 描述符協議在Python 2.7和Python 3.x中的工作方式是否相同?

再次感謝!

回答

10

有例子the docs

class StaticMethod(object): 
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, objtype=None): 
     return self.f 

和:

class ClassMethod(object): 
    "Emulate PyClassMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     def newfunc(*args): 
      return self.f(klass, *args) 
     return newfunc 
+0

我打算接受這個答案,因爲它對我原來的問題是一個很好的完整答案。不過,如果你回答我的編輯,我也會很感激!謝謝! – Tom 2012-08-04 19:03:54

1

你應該接受JF Sebastian的答案,因爲它直接回答你的問題,但問這個問題意味着你要知道描述符協議,您可以閱讀關於here的描述符協議,這是用來實現這些和其他重要Python內部特性的東西(並且可以在您的代碼中謹慎使用)。 property,並且常規的ol綁定方法是使用描述符協議寫入的其他東西。

你應該檢查一下,當你第一次閱讀它時並不那麼簡單,但它會點擊。

+0

感謝您的鏈接和解釋!請參閱我的編輯。 – Tom 2012-08-02 13:36:17