手動實現staticmethod和classmethod裝飾器

首先,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

相關文章
相關標籤/搜索