作者:老王
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__)。
|
相关推荐
如果子类没有定义自己的构造函数(即没有定义`__init__`方法),那么在实例化子类时,Python会自动调用父类的构造函数来初始化对象。例如: ```python class Son(Father): def getName(self): return 'Son' + ...
在“python课程设计-26-子类调用父类同名方法和属性之代码实现.ev4.mp4”这个视频文件中,预计会详细讲解这些知识点,并通过实例演示如何在Python中实现。观看视频将有助于直观理解并掌握这些内容,进一步提升你的...
本课程设计的主题是"子类调用父类同名方法和属性的思路分析",我们将深入探讨这一主题,理解Python中如何处理这种情况。 在Python中,子类可以通过`super()`函数来调用父类的方法和属性。`super()`函数是内置的魔法...
在这个"圣诞树代码编程python-23-子类重写父类同名属性和方法"的主题中,我们将深入探讨如何在子类中重写父类的同名属性和方法,以实现特定的功能定制。 首先,让我们了解什么是属性和方法。属性是类中用于存储数据...
本文实例讲述了Python实现子类调用父类的方法。分享给大家供大家参考。具体实现方法如下: python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的...
python 零基础学习篇面向对象编程继承9 子类调用父类同名方法和属性之代码实现.mp4
### 在Python中定义两个同名同参数的函数 在日常编程实践中,我们通常遵循一个基本原则:在一个作用域内,不允许存在两个同名的函数或变量。然而,在Python中,却存在一种特殊情况,即可以在同一作用域下定义两个...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
在Python编程语言中,继承是面向对象编程的一个核心特性,它允许子类(派生类)从父类(基类)那里获得属性和方法,从而实现代码的复用和扩展。这里我们将深入探讨单继承、多继承以及多层继承的概念、语法以及相关...
它允许你在不明确指定父类的情况下调用父类的方法。在子类中,可以这样使用`super()`: - 形式一:`super(Score, self).__init__(name)`,其中`Score`是子类,`self`是当前子类的实例。 - 形式二(Python 3.0及...
python 零基础学习篇
如果在子类中需要使用或扩展父类的初始化逻辑,了解如何正确地继承和使用`__init__`方法就变得非常重要。 #### 父类与子类的基本结构 在Python中,定义一个父类和一个继承自该父类的子类是相对简单的。下面是一个...
在Python编程语言中,子类继承父类时,有时候我们需要在子类的构造函数中调用父类的构造函数,以便初始化父类的属性。这通常发生在子类扩展父类的功能,但还需要保留父类的一些基本行为时。下面将详细讨论如何在...
在Python的面向对象编程中,当我们创建一个子类并继承自父类时,有时需要在子类中调用父类的初始化方法(`__init__`),以确保父类的某些属性或功能得以正确初始化。这是因为子类可能会重写父类的`__init__`方法,...
在Python编程语言中,当我们需要在子类中调用父类的方法时,有两种常见的方法:直接使用父类名和`self`调用方法,以及使用`super()`函数。这两种方法在不同情况下有不同的行为和适用性,特别是在处理多继承时。 ...
有时,我们希望在子类中能够直接访问父类的类成员,即类变量或类方法,而无需通过实例化对象或使用`super()`函数。本文将探讨如何在Python中实现这一目标,并提供一个利用元类(metaclass)的解决方案。 首先,让...
2. **子类与父类的交互**:在“子类调用父类同名方法和属性”(08-子类调用父类同名方法和属性之思路分析.mp4、09-子类调用父类同名方法和属性之代码实现.mp4)这一部分,视频详细讲述了如何在子类中调用父类的方法...