Python面向物件5:特殊方法
特殊方法,兩邊帶雙下劃線的方法。比如__init__(self,...) 、__del__(self) 、__call__(self, *args) 、__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__
1、構造方法,析構方法
__init__(self,...) 構造方法,這個方法在建立物件時就會訪問。也即:類後面加()呼叫執行init方法
案例1:
class foo:
def __init__(self):
print("執行init方法")
def show(self):
print('show方法')
obj=foo()#執行init方法
執行結果:
__del__(self) 析構方法,恰好在物件要被刪除之前呼叫。不用專門寫,系統會自動呼叫
2、__call__(self, *args)
物件後面+()直接呼叫call方法,此方法python獨有;
**注意:類後面加()呼叫執行init方法,物件後面()直接呼叫call方法
案例2:call方法
class foo:
def __init__(self):
print("執行init方法")
def __call__(self, *args, **kwargs):
print("執行call方法")
obj=foo()#類後加()執行init方法
obj()#物件後加()執行call方法,或者直接用Foo()()
執行結果:
3、__str__(self方法):
str方法中含有什麼,則return什麼東西,print(物件)就返回什麼東西
案例3:str方法
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
print("執行init方法")
def __str__(self):
return "name={},age={}".format(self.name,self.age)
obj=foo("aaa",123)#類後加()執行init方法
print('-----方式1:obj----------')
print(obj)#執行str方法print('-----方式2:str()----------')
ret=str(obj)#str方法的返回值
print(ret)
print('-----方式3:obj.__str__()----------')
ret3=obj.__str__()#str方法
print(ret3)
執行結果:
4、__add__(self, other)
物件相加直接執行
案例4:add方法
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
def __add__(self, other):
temp="%s-%d"%(self.name,other.age)
return temp
obj1=foo("aaa",123)#物件1
obj2=foo("bbb",455)#物件2
print("物件1",obj1)
print("物件2",obj2)
print('---自動執行add方法--------')
ret=obj1+obj2 #self代表obj1,other代表obj2
print("add方法",ret)
執行結果:
5、__dic__
獲取物件中封裝的所有欄位,用__dic__可以取到,並存放在欄位中
案例5:dic方法
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
obj1=foo("aaa",123)#類後加()執行init方法
ret2=obj1.__dict__
print("物件的所有封裝引數",ret2)
執行結果:
6、__getitem__
物件+[],執行getitem方法,並把傳入的引數賦值給item。是一個語法對應關係,對應字典中的dict[key]
案例6:getitem方法
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
def __getitem__(self, item):
print("gettem",item)
return 111
obj1=foo("aaa",123)
print('--------傳str----------')
ret1=obj1["tt"]#物件+[],執行getitem方法,並把[]中的tt賦值給item
print("ret1返回值",ret1)
print('--------傳列表----------')
ret2=obj1[1:2]#物件+[],執行getitem方法,並把[]中的1:2列表賦值給item
print("ret2",ret2)
執行結果:
案例6-2:getitem方法,可以用於傳入列表
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
def __getitem__(self, item):
print("gettem",item)
print("start",item.start)
print("stop",item.stop)
print("step",item.step)
return 111
obj1=foo("aaa",123)#類後加()執行init方法
ret2=obj1[1:20:3]#列表也能傳入,且區分起始位置,步長
print("ret2",ret2)
執行結果:
7、__setitem__
類似於字典中的重新賦值。取對應部位的key和value
案例7:setitem方法,字典重新賦值
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
def __setitem__(self, key, value):
print(key,value)
obj=foo("aaa",123)#類後加()執行init方法
obj["k2"]=333#自動執行setitem方法
執行結果:
8、__delitem__
執行del方法,可以偽造方法以作他用
案例8:delitem方法
class foo:
def __init__(self,name,age):
self.name=name
self.age=age
def __setitem__(self, key, value):
print(key,value)
def __delitem__(self, item):
print("執行del",item)
return 111
obj=foo("aaa",123)obj[1:4]=[1,2,3,4]del obj[1:2]
執行結果:
9、__iter__
生成器作用,返回值可以被迭代,需要使用for執行iter方法
案例9:iter方法,迭代
class foo:
def __iter__(self):
return iter([11,22,33,44,55])
obj=foo()
for item in obj:#for預設執行iter方法,拿到返回值,for需要一個可以被迴圈的東西(obj)
print(item)
執行結果:
案例連結:https://pan.baidu.com/s/1i44xpq9 密碼:clkp