例如,我有一个
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)
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |