面向对象:类定义中的特殊方法
2019-01-23 本文已影响0人
无尽的结
一、基本概念
1、特殊方法(special method)也被称作魔术方法(magic method)在类定义中实现一些特殊方法,可以方便地使用python中一些内置操作,所有特殊方法的名称以两个下划线(__)开始和结束
2、构造与解构
2.1对象构造器中有一种特殊方法,但对象实例化时会自动调用这个方法,而且会把这个类调用的后边的这个参数表传递给init方法,那么init的方法就可以 读取这个参数表同时赋值给这个对象,基本语法如下图:
__init__(self,[...)
2.2、析构器:在构造一个对象时可以用init这个方法来为对象实例指定有些具体的属性值之外,在对象销毁的时候也有一个特殊方法自动调用基本语法如下图:
__del__(self,[...) #销毁对象时自动调用
2.3、析构和初始化方法的使用举个例子如下图:
from os.path import join
class FileObject:#创建一个类FileObject
def __init__(self,filepath='`',filename='sample.txt'):#在初始化时给对象的实例关联了一个文件对象
'''读写模式打开一个文件'''
self.file = open(join(filepath,filename),'r+')#打开文件对象,在类的其他方法中就可以调用这个文件对象对文件进行一些操作
def __del__(self):#定义析构方法,当FileObject这个类的对象被销毁时就会调用这个方法
self.file.close()#在方法中对文件对象进行关闭
del self.file #删除文件对象
二、算术运算
1、算术操作符基本语法如下图:
__add__(self,other):使用+操作符
__sub__(self,other):使用-操作符
__mul__(self,other):使用*操作符
__div__(self,other):使用/操作符
#括号中的self,other是两个参数第一个参数就是对象实例,第二个参数是第二个对象,比如说add定义完之后就可以用一个对象加other,那么加号的右边就会被作为other传进来,加号左边的作为self传进来,就是self加other这个操作
反运算
__radd__(self,other)
__rsub__(self,other)
__rmul__(self,other)
__rdiv__(self,other)
#如果有时候左操作符不支持这个操作时就要反过来比如other加上自己
大小比较
__eq__(self,other):使用==操作符
__ne__(self,other):使用!=操作符
__lt__(self,other):使用<操作符
__gt__(self,other):使用>操作符
__le__(self,other):使用<=操作符
__ge__(self,other):使用>=操作符
#以上都是self跟other的比较,返回的都是一个逻辑数值的对象true或者false
2、对以上运算操作符举个实例如下图:
class Force: #创建一个类
def __init__(self,x,y):#类的初始化,x,y为方向分量
self.fx,self.fy = x,y #self.fx,self.fy都是对象实例属性分别记录下x,y,经过初始化之后生成f1这个对象
def show(self): #打印出力的值
print("Force<%s,%s>" % (self.fx,self.fy))
def add(self,force2):#与另一个合成
x = self.fx + force2.fx
y = self.fy + force2.fy
return Force(x,y)
__add__ = add #将__add__指向上面那个add,使得它们指向同一个函数对象
def __str__(self):
return "F<%s,%s" % (self.fx, self.fy)
def __mul__(self, n):
x, y = self.fx * n, self.fy * n #因为方向分量有数乘而没有力乘所以这里乘以一个数字n而不是乘以一个力的对象
#这里引用mul这样的形式就可以用f1乘以一个数字的形式比如说f1*3.5
#如果想反向相乘的到mul前面加一个r或者mul直接复制给rmul
return Force(x, y) #返回 一个新的力的对象
def __eq__(self, force2):#两个力之间的比较
return (self.fx == force2.fx) and (self.fy == force2.fy)#分别比较两个x,f这两个分量
#生成一个力对象
f1 = Force(0,1)
f1.show() #调用f1对象打印出力的值,show里面的参数self就是对象自己而f1也是对象自己所以就不要参数调用了
#生成另一个力对象
f2 = Force(3,4)
f3 = f1.add(f2) #将两个力合成赋值为f3生成一个新的对象
f3.show() #调用对象打印出力的值
#合成为新的力
f3 = f1 + f2
print("Fadd=%s" % (f3,))
f3 = f1 * 4.5
print("Fmul=%s" % (f3,))
print("%s==%s? -> %s" % (f1,f2,f1 == f2))
3、字符串操作
不仅数字类型可以使用像加(add())和减(sub())的数学运算符,例如字符串类型可以使用+号进行拼接,使用*号进行复制,介绍几种常用的特殊方法如下图:
__str__(self):把对象实例自动转换为字符串形式,比如说1.2变成一个字符串1.2的形式
__repr__(self):返回一个用来表示对象的字符串,功能或者说作用跟上面那个__str__(self)一样,只是这个是一个对象的官方或者说正式的表达,而__str__(self)是一个示意性的表达
__len__(self):返回元素个数,针对一些容器类的对象
其他特殊方法参见课程网站
http:/gis4g.pku.edu.cn/python-magic-method/