在python中,即使子类重写它,如何确保始终调用我的类的一个方法?

kor*_*ina 11 python subclass

例如,我有一个

class BaseHandler(object):
    def prepare(self):
        self.prepped = 1
Run Code Online (Sandbox Code Playgroud)

我不希望每个人都是BaseHandler的子类,并且也想要实现准备必须记住调用

super(SubBaseHandler, self).prepare()
Run Code Online (Sandbox Code Playgroud)

有没有办法确保运行超类方法,即使子类也实现了prepare?

j2l*_*abs 14

我使用元类解决了这个问题.

使用元类允许实现者BaseHandler确保所有子类都将调用超类prepare()而不调整任何现有代码.

元类prepare在两个类上查找实现,然后用一个调用superclass.prepare后跟的子类覆盖子类prepare subclass.prepare.

class MetaHandler(type):
    def __new__(cls, name, bases, attrs):
        instance = type.__new__(cls, name, bases, attrs)
        super_instance = super(instance, instance)
        if hasattr(super_instance, 'prepare') and hasattr(instance, 'prepare'):
            super_prepare = getattr(super_instance, 'prepare')
            sub_prepare = getattr(instance, 'prepare')
            def new_prepare(self):
                super_prepare(self)
                sub_prepare(self)
            setattr(instance, 'prepare', new_prepare)
        return instance


class BaseHandler(object):
    __metaclass__ = MetaHandler
    def prepare(self):
        print 'BaseHandler.prepare'


class SubHandler(BaseHandler):
    def prepare(self):
        print 'SubHandler.prepare'
Run Code Online (Sandbox Code Playgroud)

使用它看起来像这样:

>>> sh = SubHandler()
>>> sh.prepare()
BaseHandler.prepare
SubHandler.prepare
Run Code Online (Sandbox Code Playgroud)