python - 如何装饰继承的方法 - Python
问题描述
我必须装饰一个继承的方法,但它装饰了所有继承的方法。基本上我必须创建一个装饰器来装饰类中的一个方法。
测试看起来像这样
@my_decorator
class TestClass(Subclass):
pass
t = TestClass()
t.say_hi
假设我的子类看起来像这样
class SubClass():
def __init__(self):
pass
def say_hi():
print("Hi")
def say_wow():
print("wow")
现在我必须制作my_decorator
,必须在打印“Hi”之前装饰继承say_hi()
的print("*****")
函数
我试过这样做,但装饰器适用于所有方法SubClass
def my_decorator(cls)
def say_hi():
print("*********")
cls.say_hi()
return say_hi()
自然它适用于子类的每个功能,但我如何让它只适用于一个say_hi()
功能?- 它还返回一个TypeError "NoneType" object is not callable
解决方案
首先让我们修复SubClass
,因为实例方法在定义时需要显式实例参数:
class SubClass():
def __init__(self):
pass
def say_hi(self):
print("Hi")
def say_wow(self):
print("wow")
现在您希望装饰器将方法替换为在调用原始方法之前say_hi
打印的方法。'****'
让我们写一个装饰器来做这个(*):
def my_decorator(cls):
orig = cls.say_hi # save the original method
def say_hi(self): # define a new one
print('****')
return orig(self) # ... calling the original method
cls.say_hi = say_hi # replace the method in the class
return cls
然后你可以使用:
@my_decorator
class TestClass(SubClass):
pass
t = TestClass()
t.say_hi()
并按预期获得:
****
Hi
(*) 这是一个非常简单的装饰器,它只能替换一个say_hi(self)
方法:既没有不同的名称,也没有额外的参数,但是装饰器可以更聪明...
推荐阅读
- google-tag-manager - 触发触发器包含我没有设置的匹配正则表达式
- python - 通过 kaggle 内核中的代码生成的文件存储在哪里?
- android - 如何在 Google Playstore 上修复“违反家庭政策要求”
- python - html onclick 不适用于 https。与 http 一起使用
- mysql - 使用 TLS 与 MySQL 连接字符串的错误连接
- javascript - 单击时复制到带有父 ID 的剪贴板
- python-3.x - ValueError:模型的特征数量必须与输入匹配。模型 n_features 为 15,输入 n_features 为 90
- julia - 如何使用 Blink 通过调用加密或混淆 json 的 javascript 抓取网页?
- java - 在 Java 中为 Request 对象定义集合字段时,更好的做法是什么?
- angular - RXJS 6.5.1 和 Angular 8 中的映射函数与 Firestore 集合