> 文章列表 > 【人工智能概论】008python面向对象的程序设计

【人工智能概论】008python面向对象的程序设计

【人工智能概论】008python面向对象的程序设计

【人工智能概论】008python面向对象的程序设计

文章目录

  • 【人工智能概论】008python面向对象的程序设计
  • 1. 概念简介
  • 2. 类的创建与实例化对象
  • 3. 类属性定义及其访问
  • 4. 类中普通方法定义与调用
  • 5. 私有属性
  • 6. 构造方法
  • 7. 析构方法
  • 8. 常用的内置方法
    • 8.1 str函数
    • 8.2 比较运算内置方法
  • 9. 继承
  • 10. 子类的定义
  • 11. 方法重写、多态和鸭子类型
  • 12. super方法
    • 13. 内置函数isinstance、issubclass、type
    • 14. 类方法、静态方法与实例方法
  • 15. 动态扩展类与实例、`__slots__`变量
    • 15.1 动态扩展类与实例
    • 15.2 `__slots__`变量
  • 16. @property装饰器
  • 17. 将python文件封装成包

1. 概念简介

  • 现实生活中,具体或抽象的事物,在编程中被称为对象
  • 描述对象的编程方法,被称为面向对象的程序设计
  • 事物的特征,在程序设计中被称为对象的属性
  • 不同的对象可以有不同的行为,这些行为被称为对象的方法
  • 将具有相同属性与方法的对象们抽象描述,这就是
  • 面向对象方法的基本观点:一切系统都由对象构成。
  • 举例:

设计一个大学生类,包含学号、姓名、性别等属性,包含吃饭、睡觉、学习、娱乐等方法,具体到某个人就是一个对象。

2. 类的创建与实例化对象

  • 类的创建形式是多样的。
  • 既可以直接创建新类,也可以基于已有的若干个类创建。
  • 既可以创建类的同时创建属性与方法,也可以创建一个空的类,然后再动态添加属性与方法。
  • 属性对应变量,方法对应函数,通过类可以把二者进行捆绑封装,此即所谓类的封装性。
  1. 类的定义形式
class 类名:语句1语句2...语句n
  1. 定义一个空类
class 类名:pass # 空语句,用于占位
  1. 实例化对象
对象名 = 类名(参数表)

3. 类属性定义及其访问

  1. 定义类时指定属性
class 类名:属性名=属性值
  1. 访问类属性
  • 既可以通过类名访问,也可以通过对象访问,可借机修改属性值。
类名/对象名.属性名
  1. 为对象动态绑定新属性
  • python作为动态语言,可以动态地为对象绑定新属性。
对象名.新属性名=属性值

4. 类中普通方法定义与调用

  1. 实际上与定义函数类似,定义方法也要用到def关键字,只是定义过程中参数列表中要加个self。
  2. 类中的方法分为两类:
  • 普通方法:必须通过对象,根据方法名调用。
  • 内置方法:特殊情况下系统自动调用。
  1. 普通方法定义
class 类名:def 方法名(self,形参列表):具体语句
  1. 调用普通方法
对象名.方法名(实参列表)
  1. 类中的方法本质上就是函数,因此方法也可以有默认值。

5. 私有属性

  1. 私有属性的概念: 类内可以访问,类外不能访问,对象都不行。
  2. 私有属性的定义: 名字以两个下划线开头的属性就是私有属性,如,‘__id’。
  3. 提示: 实际上python中没有不能访问的私有属性,只需按照对象._类名__私有属性名的形式就可以实现对私有属性的访问。

6. 构造方法

  1. 概念: python的内置方法之一,方法名为__init__,创建对象时会自动执行。
  2. 作用:负责完成新创建对象的初始化工作,需要传入对象的数据可以通过它的形参列表进行传输。
  3. 注意:与普通方法类似它也至少有一个self形参。

7. 析构方法

  1. 概念: 类的另一种内置方法,方法名为__del__,在销毁一个类对象的时候会自动执行。
  2. 作用: 多用于完成待销毁对象的资源清理工作,如关闭文件。
  3. 注意: 如果多个变量对应同一片内存空间,则只有在这些变量都删除后才会销毁这片区域内保存的对象,也才会自动执行析构方法;与普通方法类似它也至少有一个self形参。

8. 常用的内置方法

8.1 str函数

  1. 方法名: __str__
  2. 作用: 如果把创建的对象直接打印出来(如print(对象名)),一般会得到对象的类别和地址,但可以用str方法来改写输出的内容。
  3. 注意: str方法的返回值必须是字符串,例:
def __str__(self):return "hello world !"

8.2 比较运算内置方法

  1. 作用: 根据类之间某些内容的比较结果而自动执行。
  2. 常见的比较方法:
    在这里插入图片描述
  3. 应用举例:
    在这里插入图片描述

9. 继承

  1. 基于已有类创建新类就用到了继承。
  2. 子类会继承父类中定义的所有属性和方法,另外也能够在子类中增加新的属性和方法。

10. 子类的定义

  1. 子类定义的语法格式
class 子类名(父类名1,父类名2..父类名n):语句1语句2

11. 方法重写、多态和鸭子类型

  1. 方法重写: 子类对父类中继承过来的方法进行重新定义,得到全新的功能。
  2. 多态: 指在执行同样代码的情况下,系统会根据对象实际所属的类去调用相应类中的方法。
  3. 鸭子类型: 在python中编写一个函数,传递实参前其参数类型是不确定的,只要传入的对象能支持程序正常运行即可;在鸭子类型中,关注的不是对象所属的类,而是一个对象能如何使用;实际上python中的多态也是借助鸭子类型实现的,与c++的多态是不一样的。
  4. 鸭子类型举例
    在这里插入图片描述
    在这里插入图片描述

12. super方法

  1. 概述: 在子类中可以通过super()方法来调用父类(超类)中的同名方法。
  2. 代码结构: super(类名,类名/对象名),第一个参数是待调用的父类,第二个参数是这个父类下的子类或子类的对象;在一个类的定义中调用super方法时,可以把两个参数都省略掉。
  3. 常见用法:调用父类的构造方法super().__init__(实参表)

13. 内置函数isinstance、issubclass、type

  1. isinstance:用于判断一个对象所属的类是否为指定类或指定类的子类。
  2. issubclass:用于判断一个类是否为另一个类的子类。
  3. type:用于获取一个对象所属的类;如果判断一个对象所属的类是否是指定类,可以使用type(对象名)==类名的方式。

14. 类方法、静态方法与实例方法

  1. 类方法:使用@classmethod修饰的方法,其第一个参数是类本身。

  2. 类方法的特点: 既可以通过类名直接调用,也可以通过对象进行调用,其第一个参数是cls,与self的功能类似且同样不用赋值。

  3. 举例:
    在这里插入图片描述在这里插入图片描述

  4. 静态方法: 使用@staticmethod修饰的方法,无需cls参数,同样的它也既可以用类名直接调用,也可以用实例调用。

  5. 举例
    在这里插入图片描述
    在这里插入图片描述

  6. 二者区别

  • 类方法要在定义的时候指出在调用它时隐式赋给他的第一个参数,这个参数一般情况下是类本身(cls),这个有点像类的实例方法中代表类实例本身的self。
  • 类的静态方法在定义的时候就不用定义这个参数,因为他是静态方法不属于任何一个类实例。
  1. 实例方法
  • 实例方法的第一个参数是实例对象self,通过self引用类属性或者实例属性,但是在相同名称的类属性和实例属性中,会先调用实例属性,因为实例属性优先级更高。

15. 动态扩展类与实例、__slots__变量

15.1 动态扩展类与实例

  1. 动态扩展: 动态的为已经创建的对象绑定新的属性与方法。
  2. 在给对象绑定方法时,需要使用types模块中的MethodType方法,其第一个参数是要绑定的函数名,第二个参数是绑定的对象名。
  3. 举例
    在这里插入图片描述
    在这里插入图片描述
  4. 注意: 如果是给对象绑定方法,则只有这个对象能用该方法;但是如果是给类绑定方法,则它的实例对象都可以使用。

15.2 __slots__变量

  1. 在定义类的时候,python提供__slots__变量用来限制可动态扩展的属性。
  2. __slots__中所做的动态扩展属性限制只对其所在的类的实例对象有效。
  3. 如果子类中没有__slots__,则子类的对象可以任意进行属性的动态扩展。
  4. 如果子类中有__slots__,则子类可扩展的属性包含其自身及其父类所定义的属性。
  5. 举例:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

16. @property装饰器

  1. 为给类的属性值赋予有效范围,引入@property装饰器。
  2. 直接使用@property可以定义一个用于获得属性值的方法(即getter)。
  3. @属性名.setter装饰器,可以获得设置属性值的方法。
  4. 若一个属性只有getter,没有setter,则该属性是只读属性。
  5. 注意: 在getter和setter方法中使用self访问属性时,需要在属性名前加下划线,以避免系统不断递归调用而出错。
  6. 举例
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

17. 将python文件封装成包

  • 把相关py文件放在一个文件夹下,此文件夹的名字即为包名,然后在该文件夹中新建一个__init__.py文件即可。
  • 调用时可以直接用包名.文件名进行引入。
  • 代码举例:
import package_folder.package_file as pkg
# 包名是package_folder, 内含package_file.py文件,文件中又有一个函数pkg_test,功能是打印一句话。pkg.pkg_test()