簡體   English   中英

用類方法裝飾類方法

[英]Decorating a class method with a class method

我正在用另一個類方法修飾一個類方法。 這個班級看起來像這樣

from functools import wraps

class MyClass(object):
    def __init__(self):
        print('Within my class object')

    def my_decorator(func_to_decorate):
        @wraps(func_to_decorate)
        def wrapper(self):
            print('Before the call')

            func_to_decorate(self)

            print('After the function call')
        return wrapper

    @my_decorator
    def print_name(self):
        print('My name is ------ ')

mobj = MyClass()
mobj.print_name()

工作正常我得到了我需要的輸出

Before the call
My name is ------ 
After the function call

但是當查看裝飾器my_decorator的函數定義時,我意識到該方法沒有采用類方法通常作為其第一個參數self

我的問題是my_decorator是什么類型? 是類方法,普通方法還是特殊方法?

通常,類中的方法采用隱式參數self如果類方法采用類方法,則采用隱式參數cls 裝飾者不帶任何一個。

有人可以解釋一下這里發生了什么嗎?

這是一個簡單的函數,因為您不需要從類或實例訪問它,因此當在類定義中用作裝飾器時,該函數不需要selfcls 僅當我們使用類或實例訪問它們時,隱式參數才由此類函數強制執行,因為通過類或實例訪問它們會返回未綁定和綁定的方法,這些方法是原始函數的薄包裝。

如果將裝飾器移到類之外,則會看到它希望您將實例作為第一個參數發送:

MyClass.print_name = MyClass.my_decorator(MyClass.print_name)
mobj = MyClass()
mobj.print_name()

錯誤:

MyClass.print_name = MyClass.my_decorator(MyClass.print_name)
TypeError: unbound method my_decorator() must be called with MyClass instance as first argument (got instancemethod instance instead)

盡管您可以通過將my_decorator聲明為一種靜態方法來避免此錯誤,該方法既不希望self也不要求cls也可以使用綁定的未綁定對象的im_func屬性訪問基礎函數:

MyClass.print_name = MyClass.my_decorator.im_func(MyClass.print_name)

您應該閱讀數據模型頁面上的Callable types部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM