Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递。
举一个很常见的例子:
>>> class Foo:
def bar(self, message):
print(message)
>>> Foo().bar("Hello, World.")
Hello, World.
当存在继承关系的时候,有时候需要在子类中调用父类的方法,此时最简单的方法是把对象调用转换成类调用,需要注意的是这时self参数需要显式传递,例如:
>>> class FooParent:
def bar(self, message):
print(message)
>>> class FooChild(FooParent):
def bar(self, message):
FooParent.bar(self, message)
>>> FooChild().bar("Hello, World.")
Hello, World.
这样做有一些缺点,比如说如果修改了父类名称,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。为了解决这些问题,Python引入了super()机制,例子代码如下:
>>> class FooParent:
def bar(self, message):
print(message)
>>> class FooChild(FooParent):
def bar(self, message):
super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, World.")
Hello, World.
表面上看 super(FooChild, self).bar(message)方法和FooParent.bar(self, message)方法的结果是一致的,实际上这两种方法的内部处理机制大大不同,当涉及多继承情况时,就会表现出明显的差异来,直接给例子:
代码一:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
A.__init__(self)
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
A.__init__(self)
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
A.__init__(self)
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
B.__init__(self)
C.__init__(self)
D.__init__(self)
print("Leave E")
E()
结果:
Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
执行顺序很好理解,唯一需要注意的是公共父类A被执行了多次。
代码二:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
super(B, self).__init__()
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
super(C, self).__init__()
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
super(D, self).__init__()
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
super(E, self).__init__()
print("Leave E")
E()
结果:
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
转自:http://hi.baidu.com/thinkinginlamp/blog/item/8905564e1f771c0eb3de05ec.html
分享到:
相关推荐
如果子类没有定义自己的构造函数(即没有定义`__init__`方法),那么在实例化子类时,Python会自动调用父类的构造函数来初始化对象。例如: ```python class Son(Father): def getName(self): return 'Son' + ...
在“python课程设计-26-子类调用父类同名方法和属性之代码实现.ev4.mp4”这个视频文件中,预计会详细讲解这些知识点,并通过实例演示如何在Python中实现。观看视频将有助于直观理解并掌握这些内容,进一步提升你的...
本课程设计的主题是"子类调用父类同名方法和属性的思路分析",我们将深入探讨这一主题,理解Python中如何处理这种情况。 在Python中,子类可以通过`super()`函数来调用父类的方法和属性。`super()`函数是内置的魔法...
python 零基础学习篇面向对象编程继承9 子类调用父类同名方法和属性之代码实现.mp4
在Python中,当我们创建一个子类并定义一个与父类同名的方法时,这个子类的方法将覆盖父类的同名方法。例如,如果父类有一个名为`display`的方法,子类也可以定义一个`display`方法,Python解释器在调用子类实例的`...
Python学习子类父类知识
### 在Python中定义两个同名同参数的函数 在日常编程实践中,我们通常遵循一个基本原则:在一个作用域内,不允许存在两个同名的函数或变量。然而,在Python中,却存在一种特殊情况,即可以在同一作用域下定义两个...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
如果我们希望子类中的某个方法与父类中的同名方法有不同的行为,可以这样做: ```python class ParentClass: def method(self): print("Parent method") class ChildClass(ParentClass): def method(self): ...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
标题“学学Python_43类的成员02 调用父类构造函数”指的是在子类中调用父类的初始化方法,以确保子类实例化时,父类的数据成员也能得到正确初始化。描述中提到的文章链接是一个CSDN博客文章,详细介绍了这个问题。 ...
然而,当多个父类中有同名的方法时,就会出现方法解析顺序(Method Resolution Order,MRO)的问题。Python使用C3线性化算法来确定多继承类中方法的调用顺序。我们可以使用`__mro__`属性来查看这个顺序。例如: ```...
它允许你在不明确指定父类的情况下调用父类的方法。在子类中,可以这样使用`super()`: - 形式一:`super(Score, self).__init__(name)`,其中`Score`是子类,`self`是当前子类的实例。 - 形式二(Python 3.0及...
### Python中子类继承父类的`__init__`方法详解 #### 前言 在面向对象编程中,继承是一种强大的机制,它允许我们创建一个新的类(子类),该类继承了现有类(父类)的所有属性和方法。Python支持这种特性,并且...
用于辅助学习并理解Python中的链表(Linked List)的使用规则、范例和简单操作等。
关于Python 2与Python 3调用父类构造方法的写法差异,Python 3引入了新的语法,使得`super()`的使用更加直观。在Python 2中,`super`函数通常需要传入当前类和对象的引用,而在Python 3中,可以简化为只传入当前类,...
这也是为什么在Python 3中推荐使用super(),而在Python 2中虽然可以使用父类名来调用父类方法,但这种方式不推荐。 总结来说,Python中的继承、重写以及super()函数的使用,是面向对象编程不可或缺的一部分。它们...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!