使用父类的装饰器方法转换类方法

海豚
def greeting_decorator(original_function):
    def return_function(*args):
        name = 'John'
        return f'Hi, I\'m {name}, fullname: {original_function(*args)}'
    return return_function

@greeting_decorator
def greeting(name, surname):
    return f'{name} {surname}'

print(greeting('John', 'Doe'))

上面,我有一个简单的装饰器功能,可以正常使用。
我想做类似的事情,但是要继承一个类。我该如何继承这样的装饰器函数:

class Guy:

    def __init__(self, name):
        self.name = 'John'

    def greeting_decorator(self, original_function):
        def return_function(*args):
            return f'Hi, I\'m {self.name}, fullname: {original_function(*args)}'
        return return_function


class GuyWithSurname(Guy):

    def __init__(self, name, surname):
        super().__init__(name)
        self.surname = surname

    @greeting_decorator # <----- here
    def __str__(self):
        return f'{self.name} {self.surname}'
    
JohnDoe = GuyWithSurname('John', 'Doe')
print(JohnDoe)
马可

如果确定父类将始终是Guy,则可以通过@Guy.greeting_decorator以下方式简单地进行注释

class Guy:

    def __init__(self, name):
        self.name = 'John'

    def greeting_decorator(original_function):
        def return_function(self, *args):
            return f'Hi, I\'m {self.name}, fullname: {original_function(self, *args)}'
        return return_function

class GuyWithSurname(Guy):

    def __init__(self, name, surname):
        super().__init__(name)
        self.surname = surname

    @Guy.greeting_decorator # <----- here
    def __str__(self):
        return f'{self.name} {self.surname}'

JohnDoe = GuyWithSurname('John', 'Doe')

这样,当您调用print(JohnDoe)它时将输出Hi, I'm John, fullname: John Doe

请注意,我必须更改greeting_decoratorreturn_function参数才能正确处理self

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章