分类:
1.创建,初始化与销毁 __init__.__del__
类实例化调用__init__;当运行结束,.del 标识符,引用计数为0的时候调用__del__
2.hash
1.内建函数hash()调用的返回值,返回一个整数,如果定义这个方法该类的实例可hash; 2.hash是为了提供set,dict的key,hash可以冲突,冲突的时候用__eq__比较内容,实现去重 3.类一般都是可以hash,由于继承基类的属性,但是没有事项__hash__,我们认为不可以hash 4.list bytearray 内部用 __hash__ = None 实现不可以hash
class Point: def __init__(self,x,y): self.x = x self.y = y def __hash__(self): #return 就是一个元祖,想要返回对象 Point(self.x,self,y) return hash((self.x,self.y)) def __eq__(self,other): #运算符重载 p1 == p2,判断对象是否相等,返回bool return (self.x,self.y) == (other.x,other.y)
# return self.x ==other.x and self.y == other.y def __repr__(self): return 'Point.x={},Point.y={}'.format(self.x,self.y)
3.bool
1.内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回bool,没有定义__bool__(),就找__len__()的长度,非0为真,如果__len__()也没有定义,所有实例都返回真
class A: def __len__(self): return 100 __hash__ = None if A(): print("real a") bool(A) bool(A())
4.可视化
1.__repr__内建函数repr()对一个对象获取字符串表达,调用魔术方法返回字符串表达,如果没有定义,就直接返回object的定义就式显示内存的地址信息 2.__str__,str()函数,内建函数format(),print()函数调用,需要返回对象的字符串表达,如果没有定义,就去调用__repr__方法返回字符串表达,如果__repr__也没有定义,就直接返回对象的内存地址信息
3.__bytes__,bytes()函数调用,返回一个对象的bytes表达,返回bytes对象
5.运算符重载
1.比较运算符:lt,le,eq,gt,ge,ne -->[<, <=, == ,> ,>= ,!=] 2.算数运算符:add,sub,mul,truediv,mod,floordiv,pow,divmod -->[+-*/% // ** divmod] 3.iadd,isub,imul,itruediv,imod,ifloordiv,ipow --> [+=,-=,*=,/=,%=,//=,**=]
class Point: def __init__(self,x,y): self.x = x self.y = y def __sub__(self,other): return Point(self.x-other.x,self.y-other.y) def __add__(self,other): return Point(self.x+other.x,self.y+other.y) def __repr__(self): return '<Point.x {},Point.y>'.format(self.x,self.y)
6.容器和大小
1.__len__:内建函数len(),返回对象长度, 2.__iter__:迭代容器的时候,调用返回一个新的迭代对象 3.__contains__:in成员运算符,没有实现就掉用__iter__方法遍历 4.__getitem__:实现self[key]访问,序列对象,key接受整数位索引,或者切片,对于set,dict,key为hashable,key不存在引发保存 5.__setitem__:是设置值的方法 6.__missing__:字典或其子类使用__getitem__调用时,key不存在执行该方法
class Cart: def __init__(self): self.items = [] def add(self,value): self.items.append(value) def __len__(self): return len(self.items) def __iter__(self): return iter(self.items) def __getitem__(self, item): return self.items[item] def __setitem__(self, key, value): self.items[key] = value def __str__(self): return str(self.items) def __add__(self, other): self.items.append(other) return self cart = Cart() print(cart) cart.add(1) cart.add(2) cart.add(3) print(cart+4+5+6) #链式变成实现加法
print(cart.__add__(17).__add__(18)
7.可调用对象
1.Pyhon一切皆对象,函数也不例外
2.__call__:类中定义一个该方法,实例就可以像函数一样调用
3.可调用对象:定义一个类,并实例化得到其实例,将实例像函数一样调用
class Point: def __init__(self,x,y): self.x = x self.y = y def __call__(self,*args,**kwargs): return "<Point {}:{}>".format(self.x,self.y) p = Point(4,5) p()
class Adder: def __call__(self,*args): ret = 0 for x in args: ret+=x self.ret = ret return ret p =Adder() p(10,10) p.ret
8.上下文管理
9.反射
10.描述器