在Python中从子级访问父类中的装饰器

doc*_*ead 8 python decorator

如何从孩子的基类访问装饰器?

我(错误地)假设了ffg.会工作:

class baseclass(object):
    def __init__(self):
        print 'hey this is the base'

    def _deco(func):
        def wrapper(*arg):
            res = func(*arg)
            print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling'
            return res
        return wrapper

    @_deco
    def basefunc(self):
        print 'I\'m a base function'
Run Code Online (Sandbox Code Playgroud)

这个类工作正常,但后来我创建了一个继承自这个的子类:

class otherclass(baseclass):
    def __init__(self):
        super(otherclass, self).__init__()
        print 'other class'


    @_deco
    def meh(self):
        print 'I\'m a function'
Run Code Online (Sandbox Code Playgroud)

这甚至不能正确导入,更不用说运行了.@_deco未定义.尝试baseclass._deco抛出一个未绑定的方法_deco()错误,这并不奇怪.

任何想法如何做到这一点,我真的想把装饰器封装在课堂上,但我没有嫁给这个想法,我需要在基础和子类中调用它.

aar*_*ing 10

class baseclass(object):
    def __init__(self):
        print 'hey this is the base'

    def _deco(func):
        def wrapper(*arg):
            res = func(*arg)
            print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling'
            return res
        return wrapper

    @_deco
    def basefunc(self):
        print 'I\'m a base function'

    @_deco
    def basefunc2(self):
        print "I'm another base function"

   #no more uses of _deco in this class
    _deco = staticmethod(_deco) 
   # this is the key. it must be executed after all of the uses of _deco in 
   # the base class. this way _deco is some sort weird internal function that 
   # can be called from within the class namespace while said namespace is being 
   # created and a proper static method for subclasses or external callers.


class otherclass(baseclass):
    def __init__(self):
        super(otherclass, self).__init__()
        print 'other class'


    @baseclass._deco
    def meh(self):
        print 'I\'m a function'
Run Code Online (Sandbox Code Playgroud)