在Python中inheritance和覆盖__init__
我正在阅读“深入Python”,并在这个例子中的类的章节:
class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename
作者然后说,如果你想覆盖__init__
方法,你必须用正确的参数显式调用父__init__
。
- 如果该
FileInfo
类拥有多个祖先类呢?- 我必须显式调用所有祖先类的
__init__
方法吗?
- 我必须显式调用所有祖先类的
- 另外,我必须做到这一点,我想重写任何其他方法?
这本书在子类超类调用方面有点过时了。 对于子类内置类也有点过时了。
现在看起来像这样
class FileInfo(dict): """store file metadata""" def __init__(self, filename=None): super( FileInfo, self ).__init__() self["name"] = filename
请注意以下几点。
-
我们可以直接子类化内置的类,如
dict
,list
,tuple
等。 -
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__
。 如果您重写父项中存在的函数,则函数也是如此。