博客
关于我
python day21
阅读量:798 次
发布时间:2023-03-05

本文共 2466 字,大约阅读时间需要 8 分钟。

OOP的三大特征及其应用

01. 继承

什么是继承?

继承是一种关系,描述两个对象之间 "什么是什么" 的关系。在程序中,继承描述的是类和类之间的关系。

例如:

  • a继承了b,a就能直接使用b已有的方法和属性;
  • a称之为子类,b称之为父类或基类。

为什么要使用继承?

  • 继承的一方可以直接使用被继承一方的已有东西;
  • 它的目的是为了重用已经有的代码,提高代码的重用性。

如何使用继承?

继承的基本语法:

class SubClass(Base):    # 子类可以扩展或修改父类的功能    pass

继承与抽象

抽象是一种表现形式,不具体、不清晰,具有模糊性和可见性。它的定义是将多个子类中相同的部分进行抽取,形成一个新的类,这个过程就是抽象的过程。

正确的使用继承

  • 先抽象,再继承;
  • 继承一个已经存在的类,扩展或修改原始功能。
  • 继承与抽象的关系

    class Teacher(Person):    def teaching(self):        print('老师教学生,写代码')

    属性查找顺序

    属性查找顺序是:先找对象本身 > 类中 > 父类 > 父类的父类 > object。

    派生

    派生类是指子类。子类通常会写一些新的代码,因此都是派生类。

    覆盖

    覆盖(override)是指子类重写父类的属性或方法。

    练习:实现一个可以限制元素类型的容器(列表、字典、元组、集合、字符串)

    class MyList(list):    def __init__(self, element_type):        super().__init__(element_type)        self.element_type = element_type    def append(self, object):        if type(object) == self.element_type:            super(MyList, self).append(object)        else:            print('元素类型不正确')

    子类中访问父类的内容

    # 方式1: super(类名称, self).调用父类的属性或方法# 方式2: super().调用父类的属性或方法

    初始化方法中必须调用 super()

    class Person:    def __init__(self, name, gender, age):        self.name = name        self.gender = gender        self.age = age    def say_hi(self):        print('name:%s, gender:%s, age:%s' % (self.name, self.gender, self.age))class Student(Person):    def __init__(self, name, gender, age, number):        super().__init__(name, gender, age)        self.number = number    def say_hi(self):        super().say_hi()        print('number:%s' % self.number)

    组合

    组合是一种关系,将一个对象作为另一个对象的属性(即 "什么有什么")。

    组合的目的

    为了代码的重用性,减少耦合度。

    何时使用继承?

    分析两个类的关系,确定是 "什么是什么" 的关系。

    何时使用组合?

    当两个类之间没有太大关系,完全不属于同一类时。

    组合的例子

    class Phone:    def __init__(self, price, kind, color):        self.price = price        self.kind = kind        self.color = color    def call(self):        print('正在呼叫XXX:')    def send_msg(self):        print('正在发送短信:')class Student:    def __init__(self, name, gender, phone):        self.name = name        self.gender = gender        self.phone = phone    def show_info(self):        print('name:%s, gender:%s' % (self.name, self.gender))

    继承的原理

    Python支持多继承,但多继承可能引发一些问题。

    菱形继承与 MRO 列表

    class A:    passclass B(A):    passclass C(A):    passclass D(A):    passprint(D.mro())  # [D, A, object]

    新式类与经典类

    • 新式类:在 Python 3 中,任何类都直接或间接继承自 object。
    • 经典类:在 Python 2 中,既不是 object 的子类,也不是新式类。

    菱形继承中的新式类与经典类

    class A:    j = 1    passclass B(A):    j = 2    passclass C(A):    j = 3    passclass D(A):    j = 4    passprint(D.j)  # 4

    总结

    当出现菱形继承时:

    • 新式类:先深度,再广度;
    • 经典类:单纯的深度优先。

    通过以上内容,我们可以清晰地理解继承的原理及其在实际开发中的应用。

    转载地址:http://jtafk.baihongyu.com/

    你可能感兴趣的文章
    Python Pandas,从.groupby().Apply()中的GROUP中分割行
    查看>>
    Python pathlib模块详解:优雅处理文件路径
    查看>>
    python Path模块的使用 glob iglob name
    查看>>
    python pickle 模块的使用
    查看>>