Python面向对象5:特殊方法

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

执行结果:

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python学习指南

python正则表达式

本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某...

26760
来自专栏学海无涯

19.Swift学习之构造函数与析构函数

11630
来自专栏小鹏的专栏

用一个脚本学习 python

# -*- coding: utf-8 -*- # Python 2.7 学习参考脚本 # print 打印函数 print "Hello Worl...

30070
来自专栏PHP在线

欢迎来到phpdaily

1.Null类型,表示空对象指针,使用typeof检测会返回object。 如果定义的变量在将来用于保存对象,最好将该变量初始化为NUll.可以体现null作为...

33670
来自专栏北京马哥教育

一篇搞定Python正则表达式

1. 正则表达式语法 1.1 字符与字符类     1 特殊字符:.^$?+*{}[]()|       以上特殊字符要想使用字面值,必须使用进行转义    ...

34960
来自专栏水击三千

JavaScript函数(二)

在前面我们已经对函数作了简单的介绍,比如函数的定义、函数的声明、函数的调用和函数的传参等。本节将进一步介绍函数的应用,深度理解函数的各种使用。 函数是一个对象,...

29170
来自专栏python学习指南

Python爬虫(十)_正则表达式

本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某...

27560
来自专栏程序员互动联盟

【Java概念学习】--数组的初始化

一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,...

348110
来自专栏编程

Python基础2字符串

String 字符串是Python中最常用的数据类型,可以用单引号和双引号创建字 符串,字符串是不可变的。 字符串的基本操作:Python内建序列包括(列表、元...

21490
来自专栏liukaili_666888999

Swift变量 常量

11520

扫码关注云+社区

领取腾讯云代金券