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___