1. 程式人生 > >Python面向物件5:特殊方法

Python面向物件5:特殊方法

特殊方法,兩邊帶雙下劃線的方法。比如__init__(self,...) 、__del__(self) 、__call__(self, *args) 、__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__

1、構造方法,析構方法

640?wx_fmt=gif&wxfrom=5&wx_lazy=1__init__(self,...)    構造方法,這個方法在建立物件時就會訪問。也即:類後面加()呼叫執行init方法

案例1:

class foo:
def __init__(self):
print("執行init方法")
def show(self):
print('show方法'
)
obj=foo()#執行init方法

執行結果:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

640?wx_fmt=gif&wxfrom=5&wx_lazy=1__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()()

執行結果:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

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)

執行結果:

0?wx_fmt=png

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)

執行結果:

0?wx_fmt=png

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)

執行結果:

0?wx_fmt=png

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)

執行結果:

0?wx_fmt=png

案例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)

執行結果:

0?wx_fmt=png

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方法

執行結果:

0?wx_fmt=png

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]

執行結果:

0?wx_fmt=png

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)

執行結果:

0?wx_fmt=png

案例連結:https://pan.baidu.com/s/1i44xpq9 密碼:clkp