零、本讲学习目标
- 了解面向对象编程思想
- 掌握类和对象的定义和使用
- 了解Python中的对象
一、面向对象
(一)程序员“面向对象”
在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象。
(二)两种编程思想实现五子棋
面向过程与面向对象的编程思想
若加入悔棋功能,面向过程和面向对象,分别怎么实现呢?
(三)面向过程 vs. 面向对象
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以了。(POP:Procedure-Oriented Programming)
面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。(OOP:Object-Oriented Programming)
(四)面向对象三大特点
面向对象是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。面向对象的特点主要可以概括为封装性、继承性和多态性。
1、封装(encapsulation)
封装是面向对象的核心思想,将对象的属性(property)和行为(behavior)封装起来,不需要让外界知道具体实现细节。
2、继承(inheritance)
继承主要描述的就是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展(extend)。
3、多态(polymorphism)
多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。
二、类和对象
(一)类和对象的关系
1、概述
面向对象的编程思想,力图让程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提出了两个概念——类和对象。
类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。简而言之,类是模板(template),对象是实例(instance)。
2、示意图
分析: 可以将上图人看作是一个类,将每个具体的人(如小韩、小石等)看作对象,从人与具体个人之间的关系便可以看出类与对象之间的关系。
说明: 类用于描述多个对象的共同特征,它是对象的模板,而对象用于描述现实中的个体,它是类的实例。对象是类的具体化,并且一个类可以对应多个对象。
(二)类的定义
1、类的构成
- 类的名称:类名,首字母必须大写,比如Person
- 类的属性:一组数据,比如姓名、性别、年龄……(描述类的特征 - 静态)
- 类的方法:允许进行操作的方法,比如说话、步行、跑步……(描述类的行为 - 动态)
2、类定义语法格式
使用class关键字来声明一个类
class 类名: 类的属性 类的方法
定义的类继承了一个或多个父类
class 类名(父类1, 父类2, …, 父类n): 类的属性 类的方法
3、案例演示
编写程序 - 类定义演示.py
(三)创建对象
1、语法格式
- 利用无参构造方法创建对象:对象名 = 类名()
- 利用有参构造方法创建对象:对象名 = 类名(参数列表)
2、给对象添加属性
对象名.新属性名 = 值
3、案例演示
编写程序 - 基于类创建对象.py
运行程序,查看结果
修改对象属性值,再访问对象方法
- 由此可见,在Person类里定义三个属性name、gender、age,所有基于该类的对象都具有同样的初始值,然后可以根据需要修改对象的属性值。
- 基于Person类再创建一个对象father,调用speak()方法,修改对象属性值,再调用speak()方法
三、Python中的对象
(一)概述
- 在前面,我们已使用过多种对象:整数对象、小数对象、字符串对象、函数对象、模块对象等。
- 用dir()函数查看一个对象有哪些属性与方法
(二)常用对象
1、整数对象
(1)查看整数对象的属性和方法
执行:dir(int)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
(2)案例演示
查看整数的字节长度 - bit_length()
327的二进制位数是9,调用bin()函数将其转换成二进制:101000111(9位)
查看复数的实部和虚部
整数转换成字节数据 - to_bytes()
演示将整数1345转换成字节数据
演示将字节数据转换成整数
演示幂运算 - __pow__()
演示比较运算
2、小数对象
(1)查看小数对象的属性和方法
执行:dir(float)
['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__round__', '__rpow__', '__rsub__', '__rtruediv__', '__set_format__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real']
(2)案例演示
保留小数位数 - __round__()
演示幂运算 - __pow__()
3、字符串对象
(1)查看字符串对象的属性和方法
执行:dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
(2)案例演示
判断字符串是不是全为数字构成 - isdigit()
判断字符串是不是全为字母构成 - isalpha()
4、函数对象
定义函数
查看函数类型
将函数对象赋值给变量
5、模块对象
导入模块并查看类型
访问模块的属性与函数
将模块对象赋值给变量
(三)两种对象
在Python的对象模型中,有两种对象:类对象和实例对象。类对象是在执行class语句时创建的,而实例对象是在调用类的时候创建的。每调用一次类,便创建一个实例对象。类对象只有一个,而实例对象可以有多个。类对象和每个实例对象都分别拥有自己的命名空间,在各自的命名空间内存储属于自己的数据。
1、类对象
- Python执行class语句时创建一个类对象和一个变量(名称就是类名称),变量引用类对象。与def类似,class也是可执行语句。导入类模块时,class语句被执行,创建类对象。
- 类中的赋值语句创建的变量是类的数据属性。与模块类似,类中的顶层赋值语句创建的变量才属于类对象。类的数据数据用“对象名.属性名”格式来访问。
- 类中的def语句定义的函数是类的方法属性,用“对象名.方法名()”格式来访问。
类的数据和方法由所有的实例对象共享。
2、实例对象
- 实例对象通过调用类对象来创建(就像调用函数一样来调用类对象)。
- 每个实例对象继承类对象的属性,并获得自己的命名空间。
- 实例对象的“私有”属性。类的方法函数的第一个参数默认为self,表示引用方法的对象实例。在方法中对self的属性赋值才会创建属于实例对象的属性。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!