gpt4 book ai didi

python - 我怎样才能确保我的类的一个方法总是被调用,即使一个子类覆盖了它?

转载 作者:太空狗 更新时间:2023-10-29 17:56:21 24 4
gpt4 key购买 nike

比如我有一个

class BaseHandler(object):
def prepare(self):
self.prepped = 1

我不希望每个子类化 BaseHandler 并且还想实现 prepare 的人都必须记住调用

super(SubBaseHandler, self).prepare()

有没有一种方法可以确保即使子类也实现了 prepare 也能运行父类(super class)方法?

最佳答案

我已经使用元类解决了这个问题。

使用元类允许 BaseHandler 的实现者确保所有子类都将调用父类(super class) 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'

使用它看起来像这样:

>>> sh = SubHandler()
>>> sh.prepare()
BaseHandler.prepare
SubHandler.prepare

关于python - 我怎样才能确保我的类的一个方法总是被调用,即使一个子类覆盖了它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com