在Python中inheritance和覆盖__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. 另外,我必须做到这一点,我想重写任何其他方法?

这本书在子类超类调用方面有点过时了。 对于子类内置类也有点过时了。

现在看起来像这样

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

请注意以下几点。

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

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

在你需要inheritance的每一个类中,你可以运行一个循环的每个需要初始化的子类的类…一个可以被复制的例子可以被更好地理解…

 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 

您并不需要调用基类的__init__方法,但通常需要这样做,因为基类将在那里进行一些重要的初始化,这些类方法的其余部分都需要进行初始化。

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

如果FileInfo类有多个祖先类,那么你应该调用所有的__init __()函数。 你也应该这样做__del __()函数,这是一个析构函数。

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