我想要一个基于传递给构造函数的参数添加mixins的类.这就是我尝试过的:
class MixinOne(object):
def print_name(self):
print("{} is using MixinOne.".format(self.name))
class MixinTwo(object):
def print_name(self):
print("{} is using MixinTwo.".format(self.name))
class Sub(object):
def __new__(cls, *args, **kwargs):
mixin = args[1]
if mixin == 'one':
bases = (MixinOne,) + cls.__bases__
elif mixin == 'two':
bases = (MixinTwo,) + cls.__bases__
return object.__new__(type('Sub', bases, dict(cls.__dict__)))
def __init__(self, name, mixin):
print('In Sub.__init__')
self.name = name
唯一的问题似乎是__init__没有被调用,所以print_name方法不起作用.
>如何让Sub上的__init__开火?
要么
>有更好的方法吗?
最佳答案 > __init__仅在__new__返回类的实例时被调用.你的on-the-fly类继承自mixin和Sub的父级,但不是来自Sub本身.如果设置bases =(MixinOne,cls),它可能会起作用.
>编写工厂函数(或classmethod),而不是重载Sub的构造.更好的是,只需创建一些子类,而不是在运行时创建类. 🙂