首页 > 解决方案 > 如何装饰继承的方法 - 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

标签: pythondecoratorpython-decorators

解决方案


首先让我们修复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)方法:既没有不同的名称,也没有额外的参数,但是装饰器可以更聪明...


推荐阅读