前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python面向对象5:特殊方法

Python面向对象5:特殊方法

作者头像
企鹅号小编
发布2018-01-29 13:05:14
5350
发布2018-01-29 13:05:14
举报
文章被收录于专栏:编程编程

特殊方法,两边带双下划线的方法。比如__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)

执行结果:

本文来自企鹅号 - 乐想屋媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 乐想屋媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档