`
cdtdx
  • 浏览: 29303 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

如何在Python中调用父类的同名方法

 
阅读更多
如何在Python中调用父类的同名方法
2009年02月05日 星期四 下午 3:38
作者:老王

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__)。
分享到:
评论

相关推荐

    python课程设计-26-子类调用父类同名方法和属性之代码实现.ev4.rar

    在“python课程设计-26-子类调用父类同名方法和属性之代码实现.ev4.mp4”这个视频文件中,预计会详细讲解这些知识点,并通过实例演示如何在Python中实现。观看视频将有助于直观理解并掌握这些内容,进一步提升你的...

    python课程设计-25-子类调用父类同名方法和属性之思路分析.ev4.rar

    本课程设计的主题是"子类调用父类同名方法和属性的思路分析",我们将深入探讨这一主题,理解Python中如何处理这种情况。 在Python中,子类可以通过`super()`函数来调用父类的方法和属性。`super()`函数是内置的魔法...

    Python实现子类调用父类的方法

    本文实例讲述了Python实现子类调用父类的方法。分享给大家供大家参考。具体实现方法如下: python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的...

    在Python中居然可以定义两个同名通参数的函数

    ### 在Python中定义两个同名同参数的函数 在日常编程实践中,我们通常遵循一个基本原则:在一个作用域内,不允许存在两个同名的函数或变量。然而,在Python中,却存在一种特殊情况,即可以在同一作用域下定义两个...

    Python学习子类父类知识

    Python学习子类父类知识

    Python子类继承父类构造函数详解

    如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。 子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__。 class Father(object): def __init__(self, ...

    Python子类父类知识学习

    在Python中,使用`class`关键字定义一个类,当我们声明一个类是另一个类的子类时,我们会使用冒号(:)后跟父类的名字,用逗号分隔多个父类。例如: ```python class ParentClass: pass class ChildClass...

    Python代码-子类不能直接使用父类的私有属性和方法.py

    ——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!

    第十二天 04单继承:子类只继承一个父类【千锋Python人工智能学院】1

    在Python编程语言中,继承是面向对象编程的一个核心特性,它允许子类(派生类)从父类(基类)那里获得属性和方法,从而实现代码的复用和扩展。这里我们将深入探讨单继承、多继承以及多层继承的概念、语法以及相关...

    python中子类调用父类函数的方法示例

    它允许你在不明确指定父类的情况下调用父类的方法。在子类中,可以这样使用`super()`: - 形式一:`super(Score, self).__init__(name)`,其中`Score`是子类,`self`是当前子类的实例。 - 形式二(Python 3.0及...

    python 零基础学习篇面向对象编程继承6 子类重写父类同名属性和方法.mp4

    python 零基础学习篇

    python中子类继承父类的__init__方法实例

    如果在子类中需要使用或扩展父类的初始化逻辑,了解如何正确地继承和使用`__init__`方法就变得非常重要。 #### 父类与子类的基本结构 在Python中,定义一个父类和一个继承自该父类的子类是相对简单的。下面是一个...

    总结python实现父类调用两种方法的不同

    python中有两种方法可以调用父类的方法: super(Child, self).method(args)  Parent.method(self, args) 我用其中的一种报了如下错误: 找不到 classobj。当我把调用改为 super(B, self).f(name) 就能正确运行,且...

    python 子类调用父类的构造函数实例

    在Python编程语言中,子类继承父类时,有时候我们需要在子类的构造函数中调用父类的构造函数,以便初始化父类的属性和方法。这个过程在Python中称为"初始化继承"。 首先,来看一个简单的例子: ```python class A...

    Python实现子类调用父类的初始化实例

    在Python的面向对象编程中,当我们创建一个子类并继承自父类时,有时需要在子类中调用父类的初始化方法(`__init__`),以确保父类的某些属性或功能得以正确初始化。这是因为子类可能会重写父类的`__init__`方法,...

    Python 继承,重写,super()调用父类方法操作示例

    这也是为什么在Python 3中推荐使用super(),而在Python 2中虽然可以使用父类名来调用父类方法,但这种方式不推荐。 总结来说,Python中的继承、重写以及super()函数的使用,是面向对象编程不可或缺的一部分。它们...

    Python 实现子类获取父类的类成员方法

    有时,我们希望在子类中能够直接访问父类的类成员,即类变量或类方法,而无需通过实例化对象或使用`super()`函数。本文将探讨如何在Python中实现这一目标,并提供一个利用元类(metaclass)的解决方案。 首先,让...

    Python安全应用程序开发方法研究.pdf

    Python安全应用程序开发方法研究.pdf

    day15视频.rar

    2. **子类与父类的交互**:在“子类调用父类同名方法和属性”(08-子类调用父类同名方法和属性之思路分析.mp4、09-子类调用父类同名方法和属性之代码实现.mp4)这一部分,视频详细讲述了如何在子类中调用父类的方法...

Global site tag (gtag.js) - Google Analytics