2024-04-26 12:30:01 发布
网友
当我们从父类继承某些东西时,使用super().method()和{}有什么区别?为什么要用一个而不是另一个?在
super().method()
我唯一想到的是,使用静态方法显然不可能调用self.method()。至于其他的事情,我想不出使用super()的理由。在
self.method()
super()
有人可以举一个例子来说明为什么要选择一个问题而不是另一个问题,或者这只是惯例问题吗?在
super().method()将调用method的父类实现,即使子类定义了它们自己的实现。您可以阅读documentation for ^{}以获得更深入的解释。在
method
class Parent: def foo(self): print("Parent implementation") class Child(Parent): def foo(self): print("Child implementation") def parent(self): super().foo() def child(self): self.foo() c = Child() c.parent() # Parent implementation c.child() # Child implementation
对于单数继承类,如Child,super().foo()与更显式的Parent.foo(self)相同。在多重继承的情况下,super将根据Method Resolution Order, or MRO决定使用哪个foo定义。在
Child
super().foo()
Parent.foo(self)
super
foo
另一个激励人心的例子:如果我们将Child子类化并编写foo的另一个实现,将调用哪个方法?在
self
self通常作为类实例方法的第一个参数,始终表示类的调用对象/实例。在
super()表示父类的对象。在方法重写的情况下,这是有用的,这是在许多编程语言的情况下,包括C++、java等。在java中,<强>超级()>强>用于调用父类的构造函数。在
请看下面的小例子。在
class TopClass(object): def __init__(self, name, age): self.name = name; self.age = age; def print_details(self): print("Details:-") print("Name: ", self.name) print("Age: ", self.age) self.method() def method(self): print("Inside method of TopClass") class BottomClass(TopClass): def method(self): print("Inside method of BottomClass") def self_caller(self): self.method() def super_caller(self): parent = super() print(parent) parent.method() child = BottomClass ("Ryan Holding", 26) child.print_details() """ Details:- Name: Ryan Holding Age: 26 Inside method of BottomClass """ parent = TopClass("Rishikesh Agrawani", 26) parent.print_details() """ Details:- Name: Rishikesh Agrawani Age: 26 Inside method of TopClass """ child.self_caller() child.super_caller() """ Inside method of BottomClass <super: <class 'BottomClass'>, <BottomClass object>> Inside method of TopClass """
super().method()
将调用method
的父类实现,即使子类定义了它们自己的实现。您可以阅读documentation for ^{对于单数继承类,如
Child
,super().foo()
与更显式的Parent.foo(self)
相同。在多重继承的情况下,super
将根据Method Resolution Order, or MRO决定使用哪个foo
定义。在另一个激励人心的例子:如果我们将
^{pr2}$Child
子类化并编写foo
的另一个实现,将调用哪个方法?在self通常作为类实例方法的第一个参数,始终表示类的调用对象/实例。在
super()表示父类的对象。在方法重写的情况下,这是有用的,这是在许多编程语言的情况下,包括C++、java等。在java中,<强>超级()>强>用于调用父类的构造函数。在
请看下面的小例子。在
相关问题 更多 >
编程相关推荐