Python编程基础之类和对象
零、本讲学习目标了解面向对象编程思想掌握类和对象的定义和使用了解Python中的对象一、面向对象一程序员“面向对象”在现实世界中存在各种不同形态的事物这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物使用对象间的关系来描述事物之间的联系这种思想就是面向对象。二两种编程思想实现五子棋面向过程与面向对象的编程思想若加入悔棋功能面向过程和面向对象分别怎么实现呢三面向过程 vs. 面向对象面向过程就是分析出解决问题所需要的步骤然后用函数把这些步骤一一实现使用的时候依次调用就可以了。POPProcedure-Oriented Programming面向对象则是把构成问题的事务按照一定规则划分为多个独立的对象然后通过调用对象的方法来解决问题。OOPObject-Oriented Programming四面向对象三大特点面向对象是把构成问题的事务按照一定规则划分为多个独立的对象然后通过调用对象的方法来解决问题。一个应用程序会包含多个对象通过多个对象的相互配合来实现应用程序的功能这样当应用程序功能发生变动时只需要修改个别的对象就可以了从而使代码更容易得到维护。面向对象的特点主要可以概括为封装性、继承性和多态性。1、封装encapsulation封装是面向对象的核心思想将对象的属性property和行为behavior封装起来不需要让外界知道具体实现细节。2、继承inheritance继承主要描述的就是类与类之间的关系通过继承可以在无需重新编写原有类的情况下对原有类的功能进行扩展extend。3、多态polymorphism多态指的是在一个类中定义的属性和功能被其他类继承后当把子类对象直接赋值给父类引用变量时相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。二、类和对象一类和对象的关系1、概述面向对象的编程思想力图让程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点面向对象的思想中提出了两个概念——类和对象。类是对某一类事物的抽象描述而对象用于表示现实中该类事物的个体。简而言之类是模板template对象是实例instance。2、示意图分析可以将上图人看作是一个类将每个具体的人如小韩、小石等看作对象从人与具体个人之间的关系便可以看出类与对象之间的关系。说明类用于描述多个对象的共同特征它是对象的模板而对象用于描述现实中的个体它是类的实例。对象是类的具体化并且一个类可以对应多个对象。二类的定义1、类的构成类的名称类名首字母必须大写比如Person类的属性一组数据比如姓名、性别、年龄……描述类的特征 - 静态类的方法允许进行操作的方法比如说话、步行、跑步……描述类的行为 - 动态2、类定义语法格式使用class关键字来声明一个类123class 类名:类的属性类的方法定义的类继承了一个或多个父类123class 类名(父类1, 父类2, …, 父类n):类的属性类的方法3、案例演示编写程序 - 类定义演示.py三创建对象1、语法格式利用无参构造方法创建对象对象名 类名()利用有参构造方法创建对象对象名 类名(参数列表)2、给对象添加属性对象名.新属性名 值3、案例演示编写程序 - 基于类创建对象.py运行程序查看结果修改对象属性值再访问对象方法由此可见在Person类里定义三个属性name、gender、age所有基于该类的对象都具有同样的初始值然后可以根据需要修改对象的属性值。基于Person类再创建一个对象father调用speak()方法修改对象属性值再调用speak()方法三、Python中的对象一概述在前面我们已使用过多种对象整数对象、小数对象、字符串对象、函数对象、模块对象等。用dir()函数查看一个对象有哪些属性与方法二常用对象1、整数对象1查看整数对象的属性和方法执行dir(int)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071[__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()函数将其转换成二进制1010001119位查看复数的实部和虚部整数转换成字节数据 - to_bytes()演示将整数1345转换成字节数据演示将字节数据转换成整数演示幂运算 -__pow__()演示比较运算2、小数对象1查看小数对象的属性和方法执行dir(float)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657[__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)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778[__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语句定义的函数是类的方法属性用“对象名.方法名()”格式来访问。类的数据和方法由所有的实例对象共享。