首先,staticmethod和classmethod裝飾器是經過非數據描述符實現的。用法簡單,這裏就不細說了。html
這裏主要分析一下staticmethod和classmethod是如何經過描述符實現的。python
from functools import partial class StaticMethod: def __init__(self, func): self.func = func def __get__(self, instance, owner): return self.func class ClassMethod: def __init__(self, func): self.func = func def __get__(self, instance, owner): # 因爲類方法須要傳遞cls做爲第一個位置參數,這裏使用偏函數固定cls爲第一個位置參數,並返回函數 return partial(self.func, owner) class A: @StaticMethod # foo = StaticMethod(foo)獲得一個描述符實例 def foo(): print('static method called') @ClassMethod # bar = ClassMethod(bar)獲得一個描述符實例 def bar(cls): print('class method called') a = A() a.foo() # 訪問描述符實例a.foo觸發調用__get__方法,而後調用__get__方法的返回值 # static method called a.bar() # class method called
若是看過了上篇property,相比之下,這個就簡單了很多。
這裏用到了偏函數、裝飾器以及面向對象的知識,但願你能駕輕就熟。函數
參考:
https://docs.python.org/3/library/functions.html#staticmethod
https://docs.python.org/3/library/functions.html#classmethodcode