Python 面向对象高级:继承与类定义详解

目录

[一、Python 中定义类的三种方式](#一、Python 中定义类的三种方式)

[1. 最基础写法](#1. 最基础写法)

[2. 带括号写法](#2. 带括号写法)

[3. 推荐写法](#3. 推荐写法)

二、什么是继承

三、单继承

四、多继承

五、多继承中的优先级问题

查看查找顺序

六、方法重写(Override)

属性也可以重写

七、子类调用父类方法

方法一:通过父类名称调用

[方法二:使用 super()](#方法二:使用 super())

八、多层继承


一、Python 中定义类的三种方式

在 Python 中,类的定义主要有以下三种写法:

1. 最基础写法

python 复制代码
class Teacher:
    pass

这种写法最简单,适用于快速创建类。


2. 带括号写法

python 复制代码
class Teacher():
    pass

这种写法和第一种本质上没有区别。


3. 推荐写法

python 复制代码
class Teacher(object):
    pass

这是目前最常见的写法。

其中:object 是 Python 中所有类的顶级父类。

在实际开发中,建议统一使用:

python 复制代码
class 类名(object):
    pass

这种形式。


二、什么是继承

现实生活中,孩子可以继承父母的一些特征。

面向对象编程中也是如此。

继承允许子类直接拥有父类的属性和方法,从而减少重复代码,提高代码复用率。

例如:

python 复制代码
class Man:
    def __init__(self,name):
        self.name = name

    def walk(self):
        print(f'{self.name}开始散步')

定义子类:

python 复制代码
class Son(Man):
    pass

测试:

python 复制代码
# 2. 创建对象
walker = Walker('小王')
walker.walk()

输出:

可以发现:子类无需重新编写代码,就能够直接使用父类中的属性和方法。


三、单继承

单继承指一个子类只继承一个父类。

语法:

python 复制代码
class 子类(父类):
    pass

示例:

python 复制代码
class Animal(object):
    def eat(self):
        print("正在吃东西")

class Dog(Animal):
    pass

dog = Dog()
dog.eat()

运行结果:

python 复制代码
正在吃东西

此时:Dog自动拥有了eat()方法。


四、多继承

Python 支持一个类同时继承多个父类。

语法:

python 复制代码
class 子类(父类1, 父类2):
    pass

例如:

python 复制代码
class Father(object):
    def eat(self):
        print("吃饭")

class Mother(object):
    def cook(self):
        print("做饭")

class Son(Father, Mother):
    pass

测试:

python 复制代码
son = Son()

son.smoke()
son.cook()

输出:

python 复制代码
吃饭
做饭

说明子类同时拥有两个父类的方法。


五、多继承中的优先级问题

如果多个父类中存在同名方法怎么办?

例如:

python 复制代码
class Father(object):
    def work(self):
        print("父亲的方法")

class Mother(object):
    def work(self):
        print("母亲的方法")

class Son(Father, Mother):
    pass

调用:

python 复制代码
son = Son()
son.work()

输出:

复制代码
父亲的方法

原因:

Python 会按照继承顺序查找。

python 复制代码
class Son(Father, Mother) #从左往右,就近原则

会优先查找:Father中的方法。


查看查找顺序

复制代码
MRO机制:
复制代码
Python中有MRO机制, 可以查看某个对象, 在调用函数时的 顺序, 即: 先找哪个类, 后找哪个类.

使用:

python 复制代码
print(Son.mro())

或者:

python 复制代码
print(Son.__mro__)

查看方法解析顺序(MRO)。

例如:

python 复制代码
[Son, Father, Mother, object]

表示 Python 按照这个顺序寻找方法。


六、方法重写(Override)

有时候父类的方法不能满足需求。

这时可以在子类中重新定义同名方法。

这就是方法重写。

示例:

python 复制代码
class Father(object):
    def work(self):
        print("父亲工作")

class Son(Father):
    def work(self):
        print("儿子工作")

测试:

python 复制代码
son = Son()
son.work()

输出:

复制代码
儿子工作

说明:

子类的方法覆盖了父类的方法。


属性也可以重写

python 复制代码
class Father(object):
    name = "张三"

class Son(Father):
    name = "李四"

son = Son()

print(son.name)

输出:

复制代码
李四

子类属性优先级高于父类。


七、子类调用父类方法

虽然子类重写了父类方法,但有时仍然希望保留父类功能。

这时可以调用父类方法。


方法一:通过父类名称调用

python 复制代码
class Father(object):
    def say(self):
        print("我是父类")

class Son(Father):
    def say(self):
        print("我是子类")

    def show(self):
        Father.say(self)

测试:

python 复制代码
son = Son()
son.show()

输出:

复制代码
我是父类

方法二:使用 super()

推荐使用:super()

例如:

python 复制代码
class Father(object):
    def say(self):
        print("我是父类")

class Son(Father):
    def show(self):
        super().say()

调用:

复制代码
son = Son()
son.show()

输出:

复制代码
我是父类

相比直接写父类名称:Father.say(self) 更加灵活,也更符合面向对象设计思想。


八、多层继承

继承关系还可以继续向下扩展。

例如:

python 复制代码
class A(object):
    pass

class B(A):
    pass

class C(B):
    pass

结构如下:

python 复制代码
A
│
B
│
C

此时:C不仅拥有B的功能,同时也拥有A的功能。

测试:

python 复制代码
class A(object):
    def test(self):
        print("A的方法")

class B(A):
    pass

class C(B):
    pass

c = C()
c.test()

输出:

复制代码
A的方法

说明多层继承链上的成员都能够被访问。

相关推荐
重生六道1 分钟前
B站视频时长统计:一段JS脚本搞定分P/合集总时长(附倍速计算)
开发语言·javascript·音视频
魔都吴所谓2 分钟前
【我的开源】Python实现一个离线 PDF 工具箱:架构、骑缝章与踩坑记录
python·pdf·开源
用户03321266636722 分钟前
Python 自动化办公:如何轻松在 PDF 中导入与导出表单数据
python
XiYang-DING26 分钟前
P5528.带过期时间的 LRU 缓存
java·开发语言·缓存
小徐不徐说30 分钟前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv
MoRanzhi120330 分钟前
第5篇(上)· 使用 PyQt5 实现 2048 算法求解版:五类搜索算法内核
python·启发式算法·强化学习·搜索算法·蒙特卡洛树搜索·2048游戏·expectimax
星川皆无恙34 分钟前
基于知识图谱的百科问答系统:Django + Neo4j 与实现
人工智能·python·机器学习·自然语言处理·django·知识图谱·neo4j
qq_4480111635 分钟前
EXEC字典沙箱仅是名字空间隔离,模块和解释器仍共享带来的坑
python
打工仔折腾 AI40 分钟前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战
FITA阿泽要努力1 小时前
/goal 命令:给 Agent 设定目标
服务器·人工智能·python·agent