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)
?这也会产生同样的效果,并且对于派生类的开发人员来说,理解起来会容易得多。