目录
[一、Python 中定义类的三种方式](#一、Python 中定义类的三种方式)
[1. 最基础写法](#1. 最基础写法)
[2. 带括号写法](#2. 带括号写法)
[3. 推荐写法](#3. 推荐写法)
[方法二:使用 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的方法
说明多层继承链上的成员都能够被访问。