运算符重载,__eq__代表==,加减乘除,取模,整除,都可以
//对应__floordiv(地板除,向下)__ 向下取整 ,/对应__truediv__真除,该带小数就带小数、
divmod 对应__divmod__连取商带取余都一起拿了
lt=less than小于 le=less equal 小于等于
eq= 等于
gt =great than大于
ge =大于等于
ne=不等于
这里面的开头字母i代表inplace,就地修改的意思,用了这些东西,就很方便再python里面实现两个实例的相加相等
这种就相当于运算符重载
如果想要直接使用-减号,就可以用sub
现在就出来年龄相减了
如果没有,就告诉你,这两个类型无法相减
只要把这个符号,重载的方法重新定义,除了self,其他所有的魔术方法都跟self有关,一般除非不得已,不建议在类上进行操作,具体操作的时候是对实例的进行操作
类是所有 实例共享的东西,放一些公共的数据
更多的应该去使用实例的属性,把类抽象成一个实例,在实例的字典上存这些数据,
写一下isub试试,-=的话就是 。tom.isub(jerry),如果没有isub,就相当于tom=tom-jerry(调用了__sub__)
如果是tom -= Jerry会先调用了isub,把返回值赋值给tom
tom -=相当于tom被后面返回的覆盖掉了,如何把tom原来的值保留,比如name
这样就返回的还是tom本身
还有一种方案
self.__class__把类型拿到(xxxxx),相当于把这个类做初始化,自己的self.name放进去,构造了一个新实例,这个新实例把tom顶掉了,
这两个tom实例,是不同的地址变了
如果有的方法在前面写过了,下面可以大胆用写过的实例来减,这一减相当于调用的就是__sub__
拿到class相当于可以构造一个实例
写死A也可以
这样就跟当前实例有关
这种减法相当于两个A实力的减法,两个A实例的减法就会调用__sub__
一般两个类型操作以后是得到同一类型数据,+=一般是就地需改,
完成一个向量的加法
这样一种返回新的,一种inplace都可以,从用户的角度感觉是感觉不出来
object只能比较地址
如果提供了__eq__,object就不知道你怎么比较,x=x,y=y,同时等于中间加上and
可否比较大小,现在提示两个point实例怎么比较大小,缺小于号
**sorted没办法对自定义的类进行排序,必须告诉它用什么排序,应该提供 一些方法来帮它排序
不同类型的实例间无非就是等还是不等的问题,但是是否可以比较大小
不同类型之间如下,可以知道等还是不等的 **
这样是p1__eq__了,所以相等提示>=不支持
知道了等等,就知道了不等,但是不知道谁大谁小
装饰器讲过,用这个,所有的排序都可以搞定
提示至少给大于小于
给一个__gt__,这么写不符合数学,但是先这么写
现在简单点,就看x轴谁大谁小
3>3返回false
把__eq__恢复
现在就开始比较大小
如果这么用装饰器写两个就够了
把装饰器的#号去掉
这样就解决了6种
有了大等推算小等,有了等推算不等,加了装饰器,需要在大等,小等,小于,大于之间选一个写出来,剩下的4个找一个
point看不出来就用repr打印出来看看
3,4在后面
自定义的类型是可以排序的,排序必须比较大小。所以把比较大小提供一下就ok,运算符重载
提供一个+号的重载,更加符合使用者的习惯
比如pathlib,使用”/“把路径组合起来
装饰器看起来好,但是有可能有性能问题,少用这个装饰器
不用装饰器,写三个即可
也就是用这三个方法就可以推断出来
所以装饰器可以不使用