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的方法

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

相关推荐
luj_176843 分钟前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
充钱大佬1 小时前
Python测试基础教程
python·log4j·apache
不听话坏1 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi072 小时前
require 和 import的区别
开发语言·前端
远离UE42 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬2 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby3 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17683 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
初心丨哈士奇4 小时前
Python 四大基础容器|列表篇
python
Mininglamp_27184 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native