当前位置:  开发笔记 > 编程语言 > 正文

如何在子类中装饰继承的方法?

如何解决《如何在子类中装饰继承的方法?》经验,为你挑选了1个好方法。

我不太确定如何在继承的方法上使用装饰器.通常装饰器放在定义之前,但对于继承的函数,定义是在父类而不是子类中给出的.我想避免重写子类中方法的定义,只需指定将装饰器放在继承的方法周围.

为了让自己更清楚,这是我的意思的一个实例:

class Person():
    def __init__(self, age):
        self.age = age

    @classmethod
    def gets_drink(cls, ):
        print "it's time to get a drink!"
        return "A beer"

def dec(some_f):
    def legal_issue(obj,):
        some_f(obj)
        return 'A Coke'
    return legal_issue

class Child(Person):
    def __init__(self, age):
        Person.__init__(self, age=age)

    #in principle i'd like to write
    #@dec
    #self.gets_drink
    #which does not work
    #the only working way I found is by defining the method as a classmethod
    #and write this:

    @dec
    def gets_drink(self, ):
        return Person.gets_drink()

dad = Person(42)
son = Child(12)

print dad.gets_drink()
print son.gets_drink()

它在这个例子中完成的方式有效,但它看起来有些奇怪,用原始方法调用替换方法只能放置装饰器.此外,为了使其工作,需要将该方法定义为父类中的类方法.

我错过了什么吗?经验丰富的开发人员会如何做到

任何帮助,见解,评论和免费咖啡都非常感谢!



1> Martijn Piet..:

你不必须使用在装饰语法装饰.它只是一个可调用的:

class Child(Person):
    def __init__(self, age):
        Person.__init__(self, age=age)

    gets_drink = dec(Person.gets_drink.__func__)

这会将装饰器的返回值作为具有相同名称的方法添加到子类.该__func__属性解包绑定(类)方法,检索原始函数.

请注意,您的新方法现在是常规方法,而不是类方法,您必须在classmethod()调用中重新包装结果.

这有效,因为语法

@decorator_expression
def function_definition():
    pass

只是语法糖:

def function_definition():
    pass
function_definition = decorator_expression(function_definition)

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有