Python 面向对象 :特殊成员
1.0.1 __call__ :__call__()的本质是将一个类变成一个函数(使这个类的实例可以像函数一样调用)
直接用obj()调用:
class Roo: def __init__(self): print('init') def __call__(self, *args, **kwargs): print('call') obj = Roo() obj() Roo()()
1.0.2 __str__ :主要用来打印,str (obj),执行obj的__str__方法,并把返回值给obj
class Roo: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return '%s---%s' %(self.name,self.age) obj = Roo('rollo',25) print(obj)
1.0.3 __int__ :转换数字
class Roo: def __init__(self): pass def __int__(self): return 123 obj = Roo() print(obj,type(obj)) #int 一个对象,自动执行对象的__int__方法,并将返回值给int的对象 r = int(obj) print(r)
1.0.4 __init__ 类()自动执行,这个是类的构造方法
1.0.5 __add__: 两个对象相加,自动执行第一个对象的__add__方法,并将第二个对象当作参数传入,一个一个
class Roo: def __init__(self,name,age): self.name = name self.age = age def __add__(self, other): #self = obj1('rollo',25) #other = obj2('beyond',29) return self.age + other.age obj1 = Roo('rollo',25) obj2 = Roo('beyond',29) ret = obj1 + obj2 print(ret,type(ret))
class Roo: def __init__(self,name,age): self.name = name self.age = age def __add__(self, other): #self = obj1('rollo',25) #other = obj2('beyond',29) # return self.age + other.age return Roo('mathew',54) obj1 = Roo('rollo',25) obj2 = Roo('beyond',29) ret = obj1 + obj2 print(ret,type(ret))
1.0.6 和__add__一样一样的。
- __add__: 加运算
- __sub__: 减运算
- __mul__: 乘运算
- __truediv__: 除运算
- __mod__: 求余运算
- __pow__: 乘方
1.0.7 __del__ :析构函数,释放对象时使用
class Roo: def __init__(self,name,age): self.name = name self.age = age def __add__(self, other): #self = obj1('rollo',25) #other = obj2('beyond',29) # return self.age + other.age return Roo('mathew',54) def __del__(self):#对象被销毁的时候,自动执行的方法 pass
1.0.8 __dict__ :将对象中封装的所有内容通过字典的形式返回
class Roo: def __init__(self,name,age): self.name = name self.age = age obj = Roo('rollo',36) ret = obj.__dict__ print(ret)
class Roo: """ 当前类 :注释也当作类的成员 """ def __init__(self,name,age): self.name = name self.age = age obj = Roo('rollo',36) ret = obj.__dict__ print(ret)
1.0.9 __getitem__ :自动执行对象的类中的__getitem__方法,索引值会当做参数传入,__setitem__,__delitem__
class Roo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): return item + 10 def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) obj = Roo('rollo',25) ret = obj[8] print(ret) obj[100] = 'mak' del obj[666]
class Roo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): return item + 10 def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) obj = Roo('rollo',25) obj = [1:4:2] #切片也是执行__getitem__方法 ret = obj[8]
__getitem__ :如果item是基本类型:int,str,就索引猎取
如果item是一个slice对象的话,就切片。
class Roo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): # return item + 10 # print(item,type(item)) if type(item) == slice: print('调用切片处理') else: print('索引处理') def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) obj = Roo('rollo',25) obj [1:4:2] #切片也是执行__getitem__方法 ret = obj[8]
class Roo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): # return item + 10 # print(item,type(item)) if type(item) == slice: # print('调用切片处理') print(item.start,item.stop,item.step) else: print('索引处理') def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) obj = Roo('rollo',25) obj [1:4:2] #切片也是执行__getitem__方法 ret = obj[8] print(ret)
同时切片也可以:__setitem__,__delitem__
class Roo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): # return item + 10 # print(item,type(item)) if type(item) == slice: # print('调用切片处理') print(item.start,item.stop,item.step) else: print('索引处理') def __setitem__(self, key, value): print(key,value) def __delitem__(self, key): print(key) obj = Roo('rollo',25) obj [1:3] = [22:66] del obj [1:3]
1.0.10 __iter__
i 是可迭代对象 ,就用iter()方法变成迭代器,才能for。
如果类 中有__iter__方法,对象就是可迭代的
对象__iter__ 的返回值,是迭代器
for循环,迭代器,next
如果是可迭代对象,用iter变成迭代器
class Roo: def __init__(self,name,age): self.name = name self.age = age def __iter__(self): return iter((1,2,3))# i 是可迭代对象 ,就用iter()方法变成迭代器,才能for。 obj = Roo('rollo',24) #1.0执行obj对象的类中的__iter__方法,并获得返回值。 #2.0 循环上一步反回来的对象 for i in obj: print(i)
1.0.11 metaclass,类的祖宗
1.0.11.1 Python中一切事物都是对象
1.0.11.2
class Roo: pass obj = Roo() #obj是对象,Roo类 #Roo类也是一个对象,type的对象
1.0.11.3 Roo = type('Roo',(object,),{'func':function}) 也是声明一个类
Roo = type('Roo',(object,),{'func':lambda x:123}) obj = Roo()
1.0.11.4
类都是type类的对象:type()
“对象”都是类的对象:类()
class Mytype(type): def __init__(self): print(123) class Roo(object,metaclass=Mytype): #metaclass 用的是mytype的构造方法,不用默认的type的__init__ def func(self): print(666)
obj= bar().
经历了,__call__方法,再到__new__,然后再到__init___