这是使用元类的好地方。您可以将自定义混合包含代码放入元中,然后您的Sub
类不需要有样板:
class AutoMixinMeta(type):
def __call__(cls, *args, **kwargs):
try:
mixin = kwargs.pop('mixin')
name = "{}With{}".format(cls.__name__, mixin.__name__)
cls = type(name, (mixin, cls), dict(cls.__dict__))
except KeyError:
pass
return type.__call__(cls, *args, **kwargs)
class Sub(metaclass = AutoMixinMeta):
def __init__(self, name):
self.name = name
现在您可以创建Sub
对象并指定 mixin,如下所示:
>>> s = Sub('foo', mixin=MixinOne)
>>> s.print_name()
foo is using MixinOne.
它会自动从 kwargs 字典中取出,所以__init__
方法可以完全不知道它的存在。
注意:Python 2 中的元类声明语法略有不同:
class Sub(object):
__metaclass__ = AutoMixinMeta
def __init__(self, name):
self.name = name