【人工智能概论】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. 类的创建与实例化对象
- 类的创建形式是多样的。
- 既可以直接创建新类,也可以基于已有的若干个类创建。
- 既可以创建类的同时创建属性与方法,也可以创建一个空的类,然后再动态添加属性与方法。
- 属性对应变量,方法对应函数,通过类可以把二者进行捆绑封装,此即所谓类的封装性。
- 类的定义形式
class 类名:语句1语句2...语句n
- 定义一个空类
class 类名:pass # 空语句,用于占位
- 实例化对象
对象名 = 类名(参数表)
3. 类属性定义及其访问
- 定义类时指定属性
class 类名:属性名=属性值
- 访问类属性
- 既可以通过类名访问,也可以通过对象访问,可借机修改属性值。
类名/对象名.属性名
- 为对象动态绑定新属性
- python作为动态语言,可以动态地为对象绑定新属性。
对象名.新属性名=属性值
4. 类中普通方法定义与调用
- 实际上与定义函数类似,定义方法也要用到def关键字,只是定义过程中参数列表中要加个self。
- 类中的方法分为两类:
- 普通方法:必须通过对象,根据方法名调用。
- 内置方法:特殊情况下系统自动调用。
- 普通方法定义
class 类名:def 方法名(self,形参列表):具体语句
- 调用普通方法
对象名.方法名(实参列表)
- 类中的方法本质上就是函数,因此方法也可以有默认值。
5. 私有属性
- 私有属性的概念: 类内可以访问,类外不能访问,对象都不行。
- 私有属性的定义: 名字以两个下划线开头的属性就是私有属性,如,‘__id’。
- 提示: 实际上python中没有不能访问的私有属性,只需按照
对象._类名__私有属性名
的形式就可以实现对私有属性的访问。
6. 构造方法
- 概念: python的内置方法之一,方法名为
__init__
,创建对象时会自动执行。 - 作用:负责完成新创建对象的初始化工作,需要传入对象的数据可以通过它的形参列表进行传输。
- 注意:与普通方法类似它也至少有一个self形参。
7. 析构方法
- 概念: 类的另一种内置方法,方法名为
__del__
,在销毁一个类对象的时候会自动执行。 - 作用: 多用于完成待销毁对象的资源清理工作,如关闭文件。
- 注意: 如果多个变量对应同一片内存空间,则只有在这些变量都删除后才会销毁这片区域内保存的对象,也才会自动执行析构方法;与普通方法类似它也至少有一个self形参。
8. 常用的内置方法
8.1 str函数
- 方法名:
__str__
。 - 作用: 如果把创建的对象直接打印出来(如print(对象名)),一般会得到对象的类别和地址,但可以用str方法来改写输出的内容。
- 注意: str方法的返回值必须是字符串,例:
def __str__(self):return "hello world !"
8.2 比较运算内置方法
- 作用: 根据类之间某些内容的比较结果而自动执行。
- 常见的比较方法:
- 应用举例:
9. 继承
- 基于已有类创建新类就用到了继承。
- 子类会继承父类中定义的所有属性和方法,另外也能够在子类中增加新的属性和方法。
10. 子类的定义
- 子类定义的语法格式
class 子类名(父类名1,父类名2..父类名n):语句1语句2
11. 方法重写、多态和鸭子类型
- 方法重写: 子类对父类中继承过来的方法进行重新定义,得到全新的功能。
- 多态: 指在执行同样代码的情况下,系统会根据对象实际所属的类去调用相应类中的方法。
- 鸭子类型: 在python中编写一个函数,传递实参前其参数类型是不确定的,只要传入的对象能支持程序正常运行即可;在鸭子类型中,关注的不是对象所属的类,而是一个对象能如何使用;实际上python中的多态也是借助鸭子类型实现的,与c++的多态是不一样的。
- 鸭子类型举例
12. super方法
- 概述: 在子类中可以通过super()方法来调用父类(超类)中的同名方法。
- 代码结构:
super(类名,类名/对象名)
,第一个参数是待调用的父类,第二个参数是这个父类下的子类或子类的对象;在一个类的定义中调用super方法时,可以把两个参数都省略掉。 - 常见用法:调用父类的构造方法
super().__init__(实参表)
。
13. 内置函数isinstance、issubclass、type
- isinstance:用于判断一个对象所属的类是否为指定类或指定类的子类。
- issubclass:用于判断一个类是否为另一个类的子类。
- type:用于获取一个对象所属的类;如果判断一个对象所属的类是否是指定类,可以使用
type(对象名)==类名
的方式。
14. 类方法、静态方法与实例方法
-
类方法:使用@classmethod修饰的方法,其第一个参数是类本身。
-
类方法的特点: 既可以通过类名直接调用,也可以通过对象进行调用,其第一个参数是cls,与self的功能类似且同样不用赋值。
-
举例:
-
静态方法: 使用@staticmethod修饰的方法,无需cls参数,同样的它也既可以用类名直接调用,也可以用实例调用。
-
举例
-
二者区别
- 类方法要在定义的时候指出在调用它时隐式赋给他的第一个参数,这个参数一般情况下是类本身(cls),这个有点像类的实例方法中代表类实例本身的self。
- 类的静态方法在定义的时候就不用定义这个参数,因为他是静态方法不属于任何一个类实例。
- 实例方法
- 实例方法的第一个参数是实例对象self,通过self引用类属性或者实例属性,但是在相同名称的类属性和实例属性中,会先调用实例属性,因为实例属性优先级更高。
15. 动态扩展类与实例、__slots__
变量
15.1 动态扩展类与实例
- 动态扩展: 动态的为已经创建的对象绑定新的属性与方法。
- 在给对象绑定方法时,需要使用types模块中的MethodType方法,其第一个参数是要绑定的函数名,第二个参数是绑定的对象名。
- 举例
- 注意: 如果是给对象绑定方法,则只有这个对象能用该方法;但是如果是给类绑定方法,则它的实例对象都可以使用。
15.2 __slots__
变量
- 在定义类的时候,python提供
__slots__
变量用来限制可动态扩展的属性。 __slots__
中所做的动态扩展属性限制只对其所在的类的实例对象有效。- 如果子类中没有
__slots__
,则子类的对象可以任意进行属性的动态扩展。 - 如果子类中有
__slots__
,则子类可扩展的属性包含其自身及其父类所定义的属性。 - 举例:
16. @property装饰器
- 为给类的属性值赋予有效范围,引入@property装饰器。
- 直接使用@property可以定义一个用于获得属性值的方法(即getter)。
- 用
@属性名.setter
装饰器,可以获得设置属性值的方法。 - 若一个属性只有getter,没有setter,则该属性是只读属性。
- 注意: 在getter和setter方法中使用self访问属性时,需要在属性名前加下划线,以避免系统不断递归调用而出错。
- 举例
17. 将python文件封装成包
- 把相关py文件放在一个文件夹下,此文件夹的名字即为包名,然后在该文件夹中新建一个
__init__.py
文件即可。 - 调用时可以直接用
包名.文件名
进行引入。 - 代码举例:
import package_folder.package_file as pkg
# 包名是package_folder, 内含package_file.py文件,文件中又有一个函数pkg_test,功能是打印一句话。pkg.pkg_test()