如何让子类自动调用父类 __init__?

use*_*548 3 python python-3.x

我有一个名为 CacheObject 的类,许多类都从它扩展而来。

现在我需要在这个班级的所有班级上添加一些共同的东西,所以我写了这个

class CacheObject(object):

    def __init__(self):
        self.updatedict = dict() 
Run Code Online (Sandbox Code Playgroud)

但是子类没有获得 updatedict 属性。我知道在 python 中调用 super init 函数是可选的,但是有没有一种简单的方法可以强制所有它们添加 init 而不是遍历所有类并逐一修改它们?

小智 7

我处于一种情况,我希望类在调用自己的构造函数之前总是按顺序调用它们的基类的构造函数。以下是应该执行您想要的操作的 Python3 代码:

  class meta(type):
    def __init__(cls,name,bases,dct):
      def auto__call__init__(self, *a, **kw):
        for base in cls.__bases__:
          base.__init__(self, *a, **kw)
        cls.__init__child_(self, *a, **kw)
      cls.__init__child_ = cls.__init__
      cls.__init__ = auto__call__init__

  class A(metaclass=meta):
    def __init__(self):
      print("Parent")

  class B(A):
    def __init__(self):
      print("Child")
Run Code Online (Sandbox Code Playgroud)

为了说明,它将表现如下:

>>> B()
Parent
Child
<__main__.B object at 0x000001F8EF251F28>
>>> A()
Parent
<__main__.A object at 0x000001F8EF2BB2B0>
Run Code Online (Sandbox Code Playgroud)


Blc*_*ght 5

我建议一个非代码修复:

super().__init__()子类在使用其中定义的任何其他方法之前应调用的文档。

这并不是一个罕见的限制。例如,请参阅threading.Thread标准库中的文档,其中说:

如果子类覆盖了构造函数,它必须确保Thread.__init__()在对线程执行任何其他操作之前调用基类构造函数 ( )。

可能还有很多其他例子,我只是碰巧打开了那个文档页面。