特殊方法,两边带双下划线的方法。比如__init__(self,...) 、__del__(self) 、__call__(self, *args) 、__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__
1、构造方法,析构方法
__init__(self,...) 构造方法,这个方法在创建对象时就会访问。也即:类后面加()调用执行init方法
classfoo:
def__init__(self):
print("执行init方法")
defshow(self):
print('show方法')
obj=foo()#执行init方法
执行结果:
__del__(self) 析构方法,恰好在对象要被删除之前调用。不用专门写,系统会自动调用
2、__call__(self, *args)
对象后面+()直接调用call方法,此方法python独有;
**注意:类后面加()调用执行init方法,对象后面()直接调用call方法
案例2:call方法
classfoo:
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方法
classfoo:
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方法
classfoo:
def__init__(self,name,age):
self.name=name
self.age=age
def__add__(self, other):
temp="%s-%d"%(self.name,other.age)
returntemp
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方法
classfoo:
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方法
classfoo:
def__init__(self,name,age):
self.name=name
self.age=age
def__getitem__(self, item):
print("gettem",item)
return111
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方法,可以用于传入列表
classfoo:
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)
return111
obj1=foo("aaa",123)#类后加()执行init方法
ret2=obj1[1:20:3]#列表也能传入,且区分起始位置,步长
print("ret2",ret2)
执行结果:
7、__setitem__
类似于字典中的重新赋值。取对应部位的key和value
案例7:setitem方法,字典重新赋值
classfoo:
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方法
classfoo:
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)
return111
obj=foo("aaa",123)
obj[1:4]=[1,2,3,4]
delobj[1:2]
执行结果:
9、__iter__
生成器作用,返回值可以被迭代,需要使用for执行iter方法
案例9:iter方法,迭代
classfoo:
def__iter__(self):
returniter([11,22,33,44,55])
obj=foo()
foriteminobj:#for默认执行iter方法,拿到返回值,for需要一个可以被循环的东西(obj)
print(item)
执行结果:
领取专属 10元无门槛券
私享最新 技术干货