Python 利用简单的元类来允许子类重载_init _uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?

Python 利用简单的元类来允许子类重载_init _uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?,python,instantiation,metaclass,Python,Instantiation,Metaclass,一些背景: 我正在创建一个非常简单的组件实体2d游戏引擎 绝大多数类都有扁平的子类层次结构 几乎所有的基类都不需要任何参数 我正在使用Python 2 因此,当前的解决方案是使基类的\uuuu init\uuu在

一些背景:

  • 我正在创建一个非常简单的组件实体2d游戏引擎

  • 绝大多数类都有扁平的子类层次结构

  • 几乎所有的基类都不需要任何参数

  • 我正在使用Python 2

因此,当前的解决方案是使基类的
\uuuu init\uuu
方法上调用可重写的
\u,因为必须执行
基类


我不一定要问你对这种做法的想法(尽管它们是受欢迎的),但主要是问我自己是否有任何陷阱或其他不愉快之处。

你不想这样做的一个原因是:可读性。它如何降低可读性?不涉及多重继承,而且很明显您是从哪个类继承的。不调用init可能不是大多数Python用户所习惯的,但这是一个非常小的、非常具有装饰性的区别。正是因为“不调用
\uuuuuu init\uuuuu
可能不是大多数Python用户所习惯的。”如果您觉得这是值得牺牲的,然后确保你清楚明确地记录你正在做的事情。还有一个事实,“绝大多数类…”与“所有类”不同。在这种情况下,孙子类应该做什么?在开始时在_init
上调用super的
?还是结局?还是静态基类的?当你使用
\uuuu init\uuuu
时,有一些著名的习语可以回答这些问题;当你发明一个新的计划时,没有。如果多重继承(甚至是带有mixin类的无钻石MI)在概念上是合理的,情况会变得更糟?即使您想这样做,为什么不使用
Base.\uuu init\uuu(self,*args)
只需调用
self.\u on\u init(*args)
?这也会产生同样的效果,并且对于派生类的开发人员来说,理解起来会容易得多。