Python继承-在子类中调用基类方法?
Posted
技术标签:
【中文标题】Python继承-在子类中调用基类方法?【英文标题】:Python inheritance - calling base class methods inside child class? 【发布时间】:2012-05-11 15:09:37 【问题描述】:让我感到困惑的是,我在任何地方都找不到对此的明确解释。 为什么以及何时需要在子类的同名方法中调用基类的方法?
class Child(Base):
def __init__(self):
Base.__init__(self)
def somefunc(self):
Base.somefunc(self)
我猜当您不想完全覆盖基类中的方法时,您会这样做。真的只有这些吗?
【问题讨论】:
【参考方案1】:通常,当您想通过修改而不是完全替换基类方法来扩展功能时,您会这样做。 defaultdict
就是一个很好的例子:
class DefaultDict(dict):
def __init__(self, default):
self.default = default
dict.__init__(self)
def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
result = self[key] = self.default()
return result
请注意,执行此操作的适当方法是发送至use super
instead of directly calling the base class。像这样:
class BlahBlah(someObject, someOtherObject):
def __init__(self, *args, **kwargs):
#do custom stuff
super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es)
【讨论】:
这个“超级”功能有什么了不起的? @user1369281:嗯,它们并不总是很棒。但是,如果您始终如一地使用它们,它们会使继承树更容易使用。例如,如果我想将我的defaultdict
更改为默认的 ordered dict。如果我使用super()
,我在代码中唯一需要更改的就是类定义。所有这些super
都会自动引用我当前类继承自的任何基类。它有利于黑盒编程。
我喜欢这个,因为它提醒你(或教导)你的类可以继承多个类。因此,如果您的父类来自您无法修改且尚未继承对象的库,则只需将 object
添加到您的类中即可。【参考方案2】:
这完全取决于类和方法。
如果你只是想在基方法运行之前/之后做一些事情,或者用不同的参数调用它,你显然会在你的子类的方法中调用基方法。
如果要替换整个方法,显然不要调用它。
【讨论】:
不过,作为旁注,您应该始终调用父类'__init__
。以上是关于Python继承-在子类中调用基类方法?的主要内容,如果未能解决你的问题,请参考以下文章
C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?