super().method()和自我方法()

2024-04-26 12:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

当我们从父类继承某些东西时,使用super().method()和{}有什么区别?为什么要用一个而不是另一个?在

我唯一想到的是,使用静态方法显然不可能调用self.method()。至于其他的事情,我想不出使用super()的理由。在

有人可以举一个例子来说明为什么要选择一个问题而不是另一个问题,或者这只是惯例问题吗?在


Tags: self事情method例子super理由区别惯例
2条回答

super().method()将调用method的父类实现,即使子类定义了它们自己的实现。您可以阅读documentation for ^{}以获得更深入的解释。在

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

对于单数继承类,如Childsuper().foo()与更显式的Parent.foo(self)相同。在多重继承的情况下,super将根据Method Resolution Order, or MRO决定使用哪个foo定义。在

另一个激励人心的例子:如果我们将Child子类化并编写foo的另一个实现,将调用哪个方法?在

^{pr2}$

self

self通常作为类实例方法的第一个参数,始终表示类的调用对象/实例。在

super()

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
"""

相关问题 更多 >