Python3面向对象
【课程18】面向对象:什么是对象
对象(object):“万物皆对象”。Python中的所有事物都是以对象形式存在,从简单的数值类型,到复杂的代码模块,都是对象。对象既表示客观世界问题空间中的某个具体事物,又表示软件系统解空间中的基本元素。
对象=属性+方法。对象以id作为标识,既包含数据(属性),也包含代码(方法),是某一类具体事物的特殊实例。对象是类的实例,是程序的基本单元。对象实现了属性和方法的封装,是一种数据抽象机制。提高了软件的重用性、灵活性、扩展性。
创建对象:要创建一个新的对象,首先必须定义一个类,用以指明该类型的对象所包含的内容(属性和方法)。同一类(class)的对象具有相同的属性和方法,但属性值和id不同。
对象的名称:赋值语句给予对象以名称,对象可以有多个名称(变量引用),但只有一个id。例:a = complex(1, 2)。
对象属性和方法的引用:.。.()。可以跟一般的变量一样用在赋值语句和表达式中。例: (1+2j).real。(1+2j).imag。“abc”.upper()。Python语言动态的特征,使得对象可以随时增加或者删除属性或者方法。
面向对象编程(OOP):是一种程序设计范型,同时也是一种程序开发方法。程序中包含各种独立而又能互相调用的对象。每个对象都能接受、处理数据并将数据传递给其他对象。
传统程序设计:将程序看作一系列函数或指令的集合。
【课程19】面向对象:类的定义(class)与调用
类(class):是对象的模版,封装了对应现实实体的性质和行为。实例对象(InstanceObjects)是类的具体化。把类比作模具,对象则是用模具制造出来的零件。类的出现,为面向对象编程的三个最重要的特性提供了实现的手段:封装性、继承性、多态性。和函数相似,类是一系列代码的封装。Python中约定,类名用大写字母开头,函数用小写字母开头,以便区分。
定义类:class语句
class :
类的初始化:
class :
def __init__(self, ):
def (self, ):
__init__()是一个特殊的函数名,用于根据类的定义创建实例对象,第一个参数必须为self。
调用类:obj = ()返回一个对象实例。调用类会创建一个对象,类方法中的self指这个对象实例。使用点(.)操作符来调用对象里的方法。
import turtle
t = turtle.Pen()
t.forward(100)
t.left(90)
【课程20】面向对象:类定义中的特殊方法
(1)_xxx:单下划线开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问;不能用from module import *导入。
(2)__xxx:双下划线开始的是私有变量/方法名,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
私有变量:实例._类名__变量名。
私有方法:实例._类名__方法名()。
(3)__xxx__:系统定义名字,前后均有一个“双下划线”代表python里特殊方法专用的标识,如__init__()代表类的构造函数。
特殊方法(specialmethod):也被称作魔术方法(magic method)。在类定义中实现一些特殊方法,可以方便地使用python中一些内置操作。所有特殊方法的名称以两个下划线(__)开始和结束。
对象构造器:__init__(self,[…)。实例化对象时调用
对象析构器:__del__(self,[…)。销毁对象时调用。
算术操作符:
__add__(self,other):使用+操作符
__sub__(self,other):使用-操作符
__mul__(self,other):使用*操作符
__div__(self,other):使用/操作符
反运算:当左操作数不支持相应的操作时被调用:
__radd__(self,other)
__rsub__(self,other)
__rmul__(self,other)
__rdiv__(self,other)
大小比较:
__eq__(self,other):使用==操作符
__ne__(self,other):使用!=操作符
__lt__(self,other):使用
__gt__(self,other):使用>操作符
__le__(self,other):使用
__ge__(self,other):使用>=操作符
字符串操作:
+进行字符串拼接
*进行字符串复制
__str__(self):自动转换为字符串
__repr__(self):返回一个用来表示对象的字符串
len__(self):返回元素个数
其他特殊方法:http://gis4g.pku.edu.cn/python-magic-method/
【课程21】自定义对象的排序
列表排序方法sort():对原列表进行排序,改变原列表内容。如果列表中的元素都是数字,默认按升序排序。通过添加参数reverse = True可改为降序排列。如果元素都是字符串,则会按照字母表顺序排列。
内置排序函数sorted():对原列表进行排序,但返回的是排好序的列表副本,原列表内容不变。
只有当列表中的所有元素都是同一种类型时,sort()和sorted()才会正常工作。
特殊方法__lt__():def __lt__(self, y)。返回True视为比y“小”,排在前。返回False视为比y“大”,排在后。只要类定义中定义了特殊方法__lt__,任何自定义类都可以使用x
由于Python的可扩展性,每种数据类型可以定义特殊方法。
可扩展的“大小”比较及排序:(1)直接调用列表sort方法。(2)可以根据__lt__定义排序,直接检验对象的大小S[i]【课程22】面向对象:类的继承
类的继承(inheritance)机制:如果一个类别A继承自另一个类别B,就把继承者A称为子类,被继承的类B称为父类、基类或超类。
代码复用:利用继承可以从已有类中衍生出新的类,添加或修改部分功能。新类具有旧类中的各种属性和方法,而不需要进行任何复制。
子类与父类定义:如果两个类具有“一般-特殊”的逻辑关系,那么特殊类就可以作为一般类的“子类”来定义,从“父类”继承属性和方法。子类对象可以调用父类方法,除非这个方法在子类中重新定义了。如果子类同名方法覆盖(Override)了父类的方法,仍然还可以调用父类的方法。子类还可以添加父类中没有的方法和属性。
class ():
def (self,…):
关于self:在类定义中,所有方法的首个参数一般都是self。self的作用:在类内部,实例化过程中传入的所有数据都赋给这个变量。self实际上代表对象实例。
.()
等价于:
.(, )
这里的对象就是self。
car=Car(‘BMW’),car.run(200)等价于Car.run(car,200)。
【课程23】异常处理
代码运行可能会意外各种错误:程序的逻辑错误、用户输入不合法等都会引发异常,但它们不会导致程序崩溃。可以利用python提供的异常处理机制,在异常出现时及时捕获并从内部消化掉。
代码错误类型:语法错误SyntaxError,除以错误ZeroDivisionError,列表下标越界IndexError,类型错误TypeError,访问变量不存在NameError,字典关键字不存在KeyError,未知的变量属性AttributeError。以上这些错误会引起程序中止退出,如果希望掌控意外,就需要在可能出错误的地方设置陷阱捕捉错误。
捕捉错误:
(1)try-except语句
try:
except [as e]:
try: #为缩进的代码设置陷阱
except: #处理错误的代码
针对不同异常可以设置多个except
(2)try-except-finally语句
try:
except [as e]:
finally:
finally: #无论出错否,都执行的代码
如果try语句块运行时没有出现错误,会跳过except
语句块执行finally语句块的内容
(3)try-except-else语句
try:
except [as e]:
else:
else: #没有出错执行的代码
【课程24】推导式
推导式:推导式是从一个或者多个迭代器快速简洁地创建数据结构的一种方法。将循环和条件判断结合,从而避免语法冗长的代码。可以用来生成列表、字典和集合。
推导式基本语法:
列表推导式:[ for in if ]
字典推导式:{: for in if }
集合推导式:{ for in if }
生成器推导式:( for in if )。返回一个生成器对象,也是可迭代对象。但生成器并不立即产生全部元素,仅在要用到元素的时候才生成,可以极大节省内存。除了通过生成器推导式创建生成器,还可以使用下一节将介绍的生成器函数。
【课程25】生成器函数
生成器(generator):是用来创建Python序列的一个对象。使用它可以迭代庞大的序列,且不需要在内存中创建和存储整个序列。通常生成器是为迭代器产生数据的。迭代器的一种实现。
生成器函数:如果要创建一个比较大的序列,生成器推导式将会比较复杂,一行表达式无法容纳,这时可以定义生成器函数。生成器函数的定义与普通函数相同,只是将return换成了yield。协同程序:可以运行的独立函数调用,函数可以暂停或挂起,并在需要的时候从离开的地方继续或重新开始。
yield语句:立即返回一个值。下一次迭代生成器函数时,从yield语句后的语句继续执行,直到再次yield返回或终止。return语句:终止函数的执行,下次调用会重新执行函数。
领取专属 10元无门槛券
私享最新 技术干货