美文网首页
面向对象:类定义中的特殊方法

面向对象:类定义中的特殊方法

作者: 无尽的结 | 来源:发表于2019-01-23 11:26 被阅读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/
    

    相关文章

      网友评论

          本文标题:面向对象:类定义中的特殊方法

          本文链接:https://www.haomeiwen.com/subject/dysrjqtx.html