在 Python 中创建一个简单的对象层次结构时,我希望能够从派生类调用父类的方法。在 Perl 和 Java 中,有一个关键字 this ( super)。在 Perl 中,我可能会这样做:
super
package Foo; sub frotz { return "Bamf"; } package Bar; @ISA = qw(Foo); sub frotz { my $str = SUPER::frotz(); return uc($str); }
在 Python 中,似乎我必须明确地从子类中命名父类。在上面的例子中,我必须执行类似 的操作Foo::frotz()。
Foo::frotz()
这似乎不对,因为这种行为使得建立深层次结构变得困难。如果子代需要知道哪个类定义了继承的方法,那么就会产生各种信息痛苦。
这是 Python 的实际限制、我的理解上的差距,还是两者兼而有之?
使用super()函数:
super()
class Foo(Bar): def baz(self, **kwargs): return super().baz(**kwargs)
对于 Python <3,您必须明确选择使用新式类并使用:
class Foo(Bar): def baz(self, arg): return super(Foo, self).baz(arg)
在 Python 中,您确实可以使用函数从父类调用方法super()。但是,语法和行为与 Perl 或 Java 等语言略有不同。让我们阐明如何在 Python 中实现这一点:
Python 的super()函数提供了一种从父类访问方法和属性的方法。以下是使用 Python 重写示例的方法:
Python复制代码class Foo: def frotz(self): return "Bamf" class Bar(Foo): def frotz(self): str_from_parent = super().frotz() # Using super() to invoke parent method return str_from_parent.upper() # Usage bar_instance = Bar() print(bar_instance.frotz()) # Outputs: "BAMF"
Foo
frotz()
"Bamf"
Bar
frotz()``Foo
super.frotz()
super().frotz()
在 Python 中使用super()可让您有效地从父类调用方法,而无需明确命名它们。这种方法旨在促进代码维护,并支持 Python 的可读性和简单性理念。它的语法和行为可能与其他语言不同,但它利用 Python 的动态特性和 MRO 在类层次结构中有效地解析方法。