class My: def init(self, die, func): self.die = die # self.die 是一个函数对象,它保存了被装饰的函数 self.func = func def call(self, *args, **kwargs): print("this is call ") # 添加新的功能 self.die() # 在 call 方法中,通过调用 self.() 执行被装饰的函数 def call(self, *args, **kwargs): print("this is func ") # 添加新的功能 self.func() # 在 call 方法中,通过调用 self.() 执行被装饰的函数 @My def test(): print("test 。。。。。。") test() self.func()为什么报错
时间: 2024-03-04 12:50:37 浏览: 52
在这个例子中,类 My 的两个方法都被定义为 __call__ 方法,这是不允许的,因为一个类只能有一个 __call__ 方法。因此,第二个方法会覆盖第一个方法,即 self.func() 会覆盖 self.die(),而 self.func 并没有被定义,所以会报错。如果你想要实现多个装饰器,应该使用不同的方法名来定义它们的功能。例如,可以将第二个方法命名为 __call_func__,然后在装饰器中调用它。
相关问题
class My: def __init__(self, die, func): self.die = die # self.die 是一个函数对象,它保存了被装饰的函数 self.func = func def __call__(self, *args, **kwargs): print("this is call ") # 添加新的功能 self.die() # 在 __call__ 方法中,通过调用 self.() 执行被装饰的函数 def __call__(self, *args, **kwargs): print("this is func ") # 添加新的功能 self.func() # 在 __call__ 方法中,通过调用 self.() 执行被装饰的函数 @My def test(): print("test 。。。。。。") test()
这段代码是一个装饰器的例子。装饰器是一个函数,它接收一个函数作为参数,并返回一个新的函数。在这个例子中,装饰器被定义为一个类 My,它接收一个函数对象作为参数,并保存在 self.die 中。然后,My 类的 __call__ 方法被定义为添加新的功能,并通过调用 self.die() 执行被装饰的函数。在这个例子中,被装饰的函数是 test(),它被装饰器 My 修饰。当 test() 被调用时,装饰器 My 的 __call__ 方法被调用,打印出 "this is call ",然后调用被装饰的函数 test(),打印出 "test 。。。。。。"。
"""call 方法 来实现装饰器""" class My: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("this is call ") # 添加新的功能 print("方法名:", self.func.__name__) self.func() @My def test(): print("test 。。。。。。") test() self.func()的作用是什么
`self.func` 是一个函数对象,它保存了被装饰的函数。在 `__call__` 方法中,通过调用 `self.func()` 执行被装饰的函数。这样,装饰器就可以在执行被装饰的函数前后添加一些额外的功能。在上述代码中,`My` 类定义了一个装饰器,用于在执行 `test` 函数前后打印一些信息。
阅读全文