Python - 面向对象编程 - super() (上)

简介: Python - 面向对象编程 - super() (上)

前置知识


 

为什么要用 super()


当子类重写了父类方法时,又想调用父类的同名方法时,就需要用到 super()

 

什么是 super


  • 在 Python 中,super 是一个特殊的类
  • super() 就是使用 super 类创建出来的对象
  • 实际应用的场景:子类在重写父类方法时,调用父类方法

 

单继承中使用 super


实例方法使用 super

类图

image.png

实际代码

class A:
    def __init__(self):
        self.n = 1
    def add(self, m):
        print(f'AAA [self] is {id(self)}')
        print(f'AAA [self.n] is {self.n}')
        self.n += m
class B(A):
    def __init__(self):
        self.n = 100
    # 重写父类方法
    def add(self, m):
        # 子类特有代码
        print(f'BBB [self] is {id(self)}')
        print(f'BBB [self.n] is {self.n}')
        # 调用父类方法
        super().add(m)
        self.n += m
b = B()
b.add(2)
print(b.n)
# 输出结果
BBB [self] is 4489158560
BBB [self.n] is 100
AAA [self] is 4489158560
AAA [self.n] is 100
104


  1. super().add()  的确调用了父类方法
  2. 重点:此时父类方法的 self 并不是父类实例对象,而是子类实例对象

 

构造方法使用 super

class Animal:
    def __init__(self, name):
        self.name = name
    def prints(self):
        print("Animale name is ", self.name)
class Dog(Animal):
    def __init__(self, name, age):
        # 调用父类的 init 构造方法
        super(Dog, self).__init__(name)
        self.age = age
    def prints(self):
        # 调用父类的方法
        super(Dog, self).prints()
        print("Dog age is ", self.age)
dog = Dog("小汪", 10)
dog.prints()
# 输出结果
Animale name is  小汪
Dog age is  10


这里用了 super(子类名, self) ,和上面的 super() 是一样效果

 

调用父类方法有两种方式

  • super().父类方法() :注意,只能在 Python 3.x 中使用
  • super(子类名, self).父类方法()

 

其实还有第三种

在 Python  2.x 的时候,如果需要调用父类的方法,还可以用

父类名.方法(self)

  • 这种方式,Python 3.x 还是支持的
  • 不过不推荐,因为父类名发生变化的话,方法调用位置的类名也要同步修改

 

通过父类名调用父类方法(不推荐)

class Animal:
    def __init__(self, name):
        self.name = name
    def prints(self):
        print("Animale name is ", self.name)
class Dog(Animal):
    def __init__(self, name, age):
        # 调用父类的 init 构造方法
        Animal.__init__(self, name)
        self.age = age
    def prints(self):
        # 调用父类的方法
        Animal.prints(self)
        print("Dog age is ", self.age)
dog = Dog("小汪", 10)
dog.prints()
# 输出结果
Animale name is  小汪
Dog age is  10


通过父类名调用的这种方式,是需要传 self 参数的哦

 

温馨提示

在开发时, 父类名.方法()super().方法() 两种方式不要混用哈

 

灵魂拷问一:既然已经重写了子类的构造方法,为什么还要去调用 super?

子类需要重写父类方法来实现子类独有的功能,但同时又需要依赖父类方法来完成某些逻辑

 

实际栗子

  • 在实现多线程的时候(后面会详细展开说多线程)
  • 父类 Thread 的构造方法包含了很多逻辑代码
  • 子线程虽然需要实现子类独有功能,但仍需父类方法来处理其他逻辑

image.png


相关文章
|
4天前
|
Python
python基础篇:面向对象编程
python基础篇:面向对象编程
21 0
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
4天前
|
Python
Python中的面向对象
【5月更文挑战第4天】面向对象编程(OOP)是Python的核心,涉及类与对象、封装、继承和多态。类是对象的模板,对象则是类的实例。例如,`Person`类有`__init__`构造方法和`greet`方法。
15 3
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
算法 Python
Python面向对象oop编程(二)
Python面向对象oop编程(二)
|
4天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
4天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
4天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
|
4天前
|
数据安全/隐私保护 Python
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
|
4天前
|
数据安全/隐私保护 Python
python基础之面向对象
面向对象编程(OOP)是一种以对象为中心的编程范式,通过对象和类实现现实世界的抽象。对象是程序的基本单元,类是对象的模板。主要特点包括:封装,通过访问修饰符隐藏对象内部细节,保证数据安全;继承,子类继承父类属性和方法,实现代码复用;多态,同方法调用在不同对象上产生不同行为,增强灵活性。示例代码展示了Python中的类定义、封装、继承和多态概念。