【 一 】什么是继承(Inheritance)
继承允许创建一个新类(称为子类或派生类),从已存在的类(称为父类或基类)继承属性和方法。子类可以继承父类的特性,并可以通过添加新的属性和方法来扩展或修改其行为。继承提供了代码重用的机制,并支持层次化的组织和分类。
-
子类继承父类的属性和方法:子类可以继承父类中的公共或保护的属性和方法。这意味着子类可以访问和使用父类已定义的字段、属性和方法,无需重新实现他们。
-
子类可以添加新的属和方法:子类可以在继承父类的基础上添加新的属性和方法,以满足自己的特定需求。这样就可以在不修改父类的情况下扩展功能
-
子类可以覆盖父类的方法:子类可以根据需要覆盖父类中的方法,以提供自己的实现。这被称为方法的重写或覆盖。通过重写父类的方法,子类可以改变方法的行为,实现自己的逻辑。
-
子类可以形成继承层次结构:* *** 通过多层次的基础, 可以形成一个继承层次结构。每个子类都可以有自己的子类,从而形成一个类的层次结构。
继承是面向对象编程中的一种重要机制,它提供了代码复用、可扩展性和灵活性。通过继承,可以设计出更加模块化、易于维护和扩展的代码结构。
【 2 】继承的应用
class Plant:
def __init__(self,flower):
self.flower = flower
def peak(self):
print(f'这是一朵{self.flower}')
# 子类继承父类
class Pose(Plant):
def __init__(self,flower):
# 调用父类的构造函数
super().__init__(flower)
def fill(self):
# 重写父类的方法
print(self.flower + '先种花先挖坑!')
# 子类继承子类
class Sakura(Pose):
def __init__(self,flower):
super().__init__(flower)
def speak(self):
# 子类添加新的方法
print(self.flower + '正在挖坑')
# 创建对象并调用方法
plant = Plant('植物')
plant.peak()
# 这是一朵植物
pose = Pose('玫瑰')
pose.fill()
# 玫瑰先种花先挖坑!
sakura = Sakura('樱花')
sakura.speak()
# 樱花正在挖坑
【 3 】 经典类和新式类
(1)前言
在Python 2.x中, 存在着经典类和新式类的概念。
在Python 3.x中, 只有新式类
经典类是指没有显示继承自object
类的类,而新式类则是显式继承自object
类的类。在 Python 2.x 中,如果一个类没有显式地继承自object
类,那么它就被视为经典类
而在 Python 3.x 中,所有的类都隐式地继承自object
类,因此都是新式类。
(2)新式类相对于经典类,优点:
-
支持新的类属性和特殊方法:
-
支持描述符, 可以对属性进行更加啊灵活的控制
-
支持方法解析顺序(MRO),可以更好地处理多继承的情况
(3)新式类和经典类的区别:
1.类的定义方式:
-
经典类:类的定义不继承自
object
类。例如:class MyClass:
。 -
新式类:类的定义显式或隐式地继承自
object
类。例如:class MyClass(object):
或class MyClass:
2.方法解析顺序:
-
经典类:采用深度优先搜索(Depth-First Search,DFS)的方式来确定方法的调用顺序。
-
新式类:采用广度优先搜索(Breadth-First Search,BFS)的方式来确定方法的调用顺序
3.属性访问方式:
-
经典类:属性的访问是通过遍历每个父类,并按照继承顺序查找属性。
-
新式类:属性的访问是通过 C3 线性化算法计算出的 MRO 来决定属性的查找顺序。
4.内置函数super()的行为:
-
经典类:
super()
函数只能用于绑定最近父类的方法。 -
新式类:
super()
函数可以用于调用任意父类的方法。
# 经典类
class A:
pass
# 新式类
class B(object):
pass
# 输出类的类型
print(type(A)) # <type 'classobj'>
print(type(B)) # <class 'type'>