gpt4 book ai didi

python - 用类方法修饰类方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:16:10 25 4
gpt4 key购买 nike

我正在用另一个类方法装饰一个类方法。类看起来像这样

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类定义为装饰器。仅当我们使用类或实例访问它们时,这些函数才会强制隐式参数,因为通过类或实例访问它们会返回未绑定(bind)和绑定(bind)的方法,这些方法是原始函数的薄包装器。

如果您将装饰器移到类之外,那么您会看到它希望您发送一个实例作为第一个参数:

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 或使用 访问底层函数code>im_func 绑定(bind)、未绑定(bind)对象的属性:

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

您应该阅读 data model 上的可调用类型部分页。

关于python - 用类方法修饰类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24970972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com