在Python中创建一个简单的对象层次结构时,我希望能够从派生类中调用父类的方法 . 在Perl和Java中,有一个关键字(super) . 在Perl中,我可能会这样做:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
在python中,似乎我必须从子类中明确命名父类 . 在上面的例子中,我必须做像 Foo::frotz()
这样的事情 .
这似乎不对,因为这种行为使得很难制作深层次结构 . 如果孩子需要知道哪个类定义了一个继承的方法,那么就会产生各种各样的信息痛苦 .
这是python中的实际限制,是我理解中的差距还是两者兼而有之?
14 回答
在Python 2中,我对super()没有太多运气 . 我在这个SO线程how to refer to a parent method in python?上使用了jimifiki的答案 . 然后,我添加了自己的小麻烦,我认为这是一个可用性的改进(特别是如果你有长名字) .
在一个模块中定义基类:
然后将该类导入另一个模块
as parent
:这是一个更抽象的方法:
无论直接父类是定义
frotz
本身还是继承它,都会没问题 . 只有在适当支持多重继承时才需要super
(然后只有在每个类正确使用它时它才有效) . 一般情况下,如果AnyClass
没有定义/覆盖它,AnyClass.whatever
将在AnyClass
的祖先中查找whatever
,这对于"child class calling parent's method"也适用于任何其他事件!我建议使用_471915这样的东西
是的,但只有new-style classes . 使用super()功能:
Python 3具有用于调用父方法的不同且更简单的语法 . 如果
Foo
类继承自Bar
,则可以使用super().__init__()
从Foo
调用Bar.__init__
:以下是使用 super() 的示例:
在此示例中,cafec_param是基类(父类),abc是子类 . abc在基类中调用AWC方法 .
Output
56
56
56
许多答案已经解释了如何从已在子项中重写的父项调用方法 .
然而
也可能只是意味着:
您可以调用从父类继承的方法,就像它们是子类的方法一样,只要它们没有被覆盖 .
例如在python 3中:
是的,这可能是相当明显的,但我觉得如果不指出这一点,人们可能会留下这个线程的印象,你必须跳过荒谬的箍只是为了访问python中的继承方法 . 特别是因为这个问题在“如何在Python中访问父类的方法”的搜索中得到高度评价,并且OP是从一个新的python的角度编写的 .
我发现:https://docs.python.org/3/tutorial/classes.html#inheritance有助于理解如何访问继承的方法 .
如果你不知道你可能得到多少个参数,并且想要将它们全部传递给孩子:
(来自:Python - Cleanest way to override init where an optional kwarg must be used after the super() call?)
Python也有super:
super(type[, object-or-type])
例:
Python中也有一个super() . 由于Python的旧式和新式类,它有点不稳定,但是很常用,例如在构造函数中:
python中也有一个super() .
如何从子类方法调用超类方法的示例
这个例子类似于上面解释的那个 . 但是有一个区别是super没有任何参数传递给它 . 上面的代码可以在python 3.4版本中执行 .