我有一个混合类,即增加了一些功能,以继承类,但混入需要一些类属性是存在,为简单起见,假设只有一个属性handlers
。因此,这将是混入的使用:被定义动态类变量添加到类继承的混合类
class Mixin:
pass
class Something(Mixin):
handlers = {}
的混入不能没有这个功能,但是我真的不希望指定在每类中的handlers
,我想使用与混入。所以,我解决了这个写元类:
class MixinMeta:
def __new__(mcs, *args, **kwargs):
cls = super().__new__(mcs, *args, **kwargs)
cls.handlers = {}
return cls
class Mixin(metaclass=MixinMeta):
pass
而且这个作品正是我想要它。但我认为这可能会成为一个大问题,因为元类不能很好地协同工作(我读过各种元类冲突只能通过创建一个解决这些冲突的新元类来解决)。
而且,我不想让handlers
属性Mixin
类本身的属性,因为这将意味着具有自己的类名来存储Mixin
类的内部处理程序,有点复杂的代码。我喜欢让每个班级都有自己的班级,这使得他们更简单地工作,但显然这有缺点。
我的问题是,这将是实现这个更好的办法?我对元类相当陌生,但他们似乎很好地解决了这个问题。但是,在处理复杂的层次结构时,元类冲突显然是一个巨大的问题,无需为了解决这些冲突而定义各种元类。
*“这可以成为一个巨大的问题” * - 如果它不? – jonrsharpe
的Python 3.6是会得到一个['__init_subclass__'(https://www.python.org/dev/peps/pep-0487/)钩住会让你做你想做的,而不元类,但是3.6 ISN”在这里呢。 – user2357112
@jonrsharpe它在最微不足道的情况下。我有一个元类,构造了所有的小部件。现在元类扩展了几次,每次都有其独立的用例。现在假设我想创建一个使用这些元类和我的元类的小部件,我需要制作尽可能多的元类来处理冲突,因为还有一些其他类仅用于一个附加的元类。这对我来说似乎不可行。 – Pavlin