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

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

作者: 无尽的结 | 来源:发表于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/

相关文章

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

    一、基本概念 1、特殊方法(special method)也被称作魔术方法(magic method)在类定义中实...

  • Python学习笔记5

    面向对象 类和对象的创建 属相相关 方法相关 元类 内置的特殊属性 内置的特殊方法 面向对象 类和对象的创建 类 ...

  • 学习第十八天总结

    一、学习内容 1、今天Python重新学习了前面的课程面向对象的章节,主要学习了类的定义与调用、类定义中的特殊方法...

  • Python的静态方法和类方法

    Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的类方法,也可以是 @static...

  • python基础-09-面向对象、装饰器

    面向对象 类概念 类的定义 类的实例化 类和实例的属性 类的私有变量 数据封装 继承 多态 多继承 类的特殊方法 ...

  • java.dya5

    今天开始学习java面向对象的只是,学习有关类方面的内容,有类的定义,类中变量的定义,方法的定义,类的实例化,方法...

  • 21.Python编程:访问权限

    前面一节重点学习了Python3中的面向对象最基础的类和对象的知识:类的定义、对象、构造方法、属性和方法等,在类中...

  • Python面向对象编程

    本节课纲 类和对象 类的定义 self参数 初始化方法init() _str_()方法 面向对象vs面向过程 私有...

  • 10面向对象

    一.面向对象基础 #类的定义与调用 #定义类使用chass关键字,然后继承至object类、 #2.在类中定义方法...

  • 面向对象

    面向对象 通过字典存储属性 类 类名 属性 方法 定义一个类:==在类中定义的方法,第一个参数都要写self== ...

网友评论

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

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