为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

眼眸繁星 2023-07-27 16:21:59
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_decoratordef 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_functionclass 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)
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

如果您确定父类始终是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_decorator和return_function参数才能正确处理self.


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信