Python 中的继承和重写__ init__

我正在读《深入 Python 》 ,在关于类的章节中给出了这个例子:

class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename

然后作者指出,如果要重写 __init__方法,则必须使用正确的参数显式调用父 __init__

  1. 如果那个 FileInfo类有多个祖先类会怎样?
    • 我必须显式调用所有祖先类的 __init__方法吗?
  2. 还有,我是否需要对其他要重写的方法执行此操作?
214796 次浏览

如果 FileInfo 类有多个祖先类,那么您肯定应该调用它们的所有 __init__()函数。您还应该对 __del__()函数执行相同的操作,这是一个析构函数。

这本书在子类-超类调用方面有点过时了。在子类化内置类方面,它也有点过时了。

现在看起来是这样的:

class FileInfo(dict):
"""store file metadata"""
def __init__(self, filename=None):
super(FileInfo, self).__init__()
self["name"] = filename

请注意:

  1. 我们可以直接子类化内置类,如 dictlisttuple等。

  2. super函数处理跟踪这个类的超类并适当地调用它们中的函数。

是的,您必须为每个父类调用 __init__。对于函数也是如此,如果要重写存在于父级中的函数。

实际上并不需要 来调用基类(es)的 __init__方法,但通常需要 想要来调用,因为基类将在那里执行一些重要的初始化操作,而这些操作是其他类方法工作所必需的。

对于其他方法,这取决于您的意图。如果您只是想向基类行为添加一些内容,那么您需要在自己的代码中另外调用基类方法。如果希望从根本上改变行为,则可能不会调用基类的方法并直接在派生类中实现所有功能。

在需要继承的每个类中,可以在子类启动时运行每个需要 init’d 的类的循环... 一个可以复制的示例可能更好理解..。

class Female_Grandparent:
def __init__(self):
self.grandma_name = 'Grandma'


class Male_Grandparent:
def __init__(self):
self.grandpa_name = 'Grandpa'


class Parent(Female_Grandparent, Male_Grandparent):
def __init__(self):
Female_Grandparent.__init__(self)
Male_Grandparent.__init__(self)


self.parent_name = 'Parent Class'


class Child(Parent):
def __init__(self):
Parent.__init__(self)
#---------------------------------------------------------------------------------------#
for cls in Parent.__bases__: # This block grabs the classes of the child
cls.__init__(self)      # class (which is named 'Parent' in this case),
# and iterates through them, initiating each one.
# The result is that each parent, of each child,
# is automatically handled upon initiation of the
# dependent class. WOOT WOOT! :D
#---------------------------------------------------------------------------------------#






g = Female_Grandparent()
print g.grandma_name


p = Parent()
print p.grandma_name


child = Child()


print child.grandma_name