Python面向对象之继承

【  一 】什么是继承(Inheritance)

        继承允许创建一个新类(称为子类或派生类),从已存在的类(称为父类或基类)继承属性和方法。子类可以继承父类的特性,并可以通过添加新的属性和方法来扩展或修改其行为。继承提供了代码重用的机制,并支持层次化的组织和分类。

  1. 子类继承父类的属性和方法:子类可以继承父类中的公共或保护的属性和方法。这意味着子类可以访问和使用父类已定义的字段、属性和方法,无需重新实现他们。

  2. 子类可以添加新的属和方法:子类可以在继承父类的基础上添加新的属性和方法,以满足自己的特定需求。这样就可以在不修改父类的情况下扩展功能

  3. 子类可以覆盖父类的方法:子类可以根据需要覆盖父类中的方法,以提供自己的实现。这被称为方法的重写或覆盖。通过重写父类的方法,子类可以改变方法的行为,实现自己的逻辑。

  4. 子类可以形成继承层次结构:* *** 通过多层次的基础, 可以形成一个继承层次结构。每个子类都可以有自己的子类,从而形成一个类的层次结构。

继承是面向对象编程中的一种重要机制,它提供了代码复用、可扩展性和灵活性。通过继承,可以设计出更加模块化、易于维护和扩展的代码结构。

【 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))  # 
print(type(B))  # 
在 Python 3 中,不再需要显式地继承自 object 类,因为所有的类都被认为是新式类。所以,Python 3 中的类默认都具有新式类的特性。

深度优先

Python面向对象之继承_第1张图片

广度优先

Python面向对象之继承_第2张图片

你可能感兴趣的:(python,开发语言)