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 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特1 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
风之所往_2 小时前
Python 3.4 新特性全面总结
python
雪度娃娃2 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
太阳上的雨天2 小时前
任何格式的文件转Markdown
python·ai
yaoxin5211233 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
喵星人工作室3 小时前
C++火影忍者1.1.2
开发语言·c++
weixin_468466853 小时前
纳米 AI 搜索新手极速上手指南
人工智能·python·深度学习·搜索引擎·ai·语言模型·自然语言处理
凯瑟琳.奥古斯特3 小时前
数据库原理选择题精选
数据库·python·职场和发展