魔术方法
2018-11-26 07:59:59来源:博客园 阅读 ()
类的常用魔术方法:无需人为调用,基本是在特定的时刻自动触发,方法名被前后两个下划线包裹
魔术方法,总结表:
__init__:构造函数。初始化的时候调用。
__new__:对象实例化方法,其实这才是类里面第一个被调用的方法,在构造函数之前调用,之后才是__init__,只是这个比较特殊,一般不使用。
__call__:对象当函数的时候触发。
1 class A(): 2 def __init__(self,name = 0): 3 print("哈哈,我是构造函数") 4 5 def __call__(self): 6 print("我是__call__函数") 7 8 a = A() 9 a() #对象当函数使用,如果没有__call__函数会报错
__str__:当对象被当做字符串使用过的时候调用。
1 class A(): 2 def __init__(self,name = 0): 3 print("哈哈,我是构造函数") 4 5 def __str__(self): 6 return "我只是一个例子" 7 8 a = A() 9 print(a) #把对象当字符串使用
__repr__:返回字符串,跟__str__函数差不多。
属性操作相关:
__getattr__:访问不存在属性的时候触发。拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法
__setattr__:对成员属性进行设置的时候触发,有三个参数--
1,self用来获取当前对象
2,被设置的属性名称,以字符串形式出现
3,需要对属性名称设置的值
作用:进行属性设置的时候进行验证或者修改。
会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__setattr__("attr", value).这个需要注意。
当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成
无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value.
1 A(): 2 def __init__(self): 3 pass 4 def __setattr__(self, name, value): 5 print("设置属性:{0}".format(name)) 6 self.name = value #这句语句会导致死循环 7 8 a = A() 9 a.age = 18
所以为了避免死循环,规定统一调用父类魔法函数:
1 class A(): 2 def __init__(self): 3 pass 4 def __setattr__(self, name, value): 5 print("设置属性:{0}".format(name)) 6 super().__setattr__(name,value) #super函数调用父类,避免死循环 7 8 a = A() 9 a.age = 18
如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。
1 # -*- coding:utf-8 -*- 2 class DataTest: 3 def __init__(self,id,address): 4 self.id=id 5 self.address=address 6 self.d={self.id:1, 7 self.address:"192.168.1.1" 8 } 9 10 def __getitem__(self,key): 11 return "hello" 12 13 14 data=DataTest(1,"192.168.2.11") 15 print data[2]
__xxxitem__: 当以[ ” “ ] 的方式访问属性时,就会调用此类型的方法
setitem:当属性被以索引方式赋值的时候会调用该方法
getitem:一般如果想使用索引访问元素时,就可以在类中定义这个方法
delitem:当使用索引删除属性时调用该方法
实例
1 __Author__ = "Lance#" 2 3 # -*- coding = utf-8 -*- 4 5 class Point: 6 def __init__(self): 7 pass 8 9 def __str__(self): 10 return 'Point is (%s,%s)' %(self.x, self.y) 11 12 def __setitem__(self, key, value): 13 print('Called the __setitem__ function') 14 self.__dict__[key] = value 15 16 def __getitem__(self, item): 17 print('Called the __getitem__ function') 18 try: 19 if item == 'x': 20 return '%s' %self.x 21 elif item == 'y': 22 return '%s' %self.y 23 except: 24 return 'There is no this item in class Point' 25 26 def __delitem__(self, key): 27 del self.__dict__[key] 28 29 if __name__ == '__main__': 30 p = Point() 31 p['x'] = 3 32 print(p['x']) 33 p['y'] = 6 34 print(p) 35 del p['x'] 36 print(p['x'])
运行结果
1 Called the __setitem__ function 2 Called the __getitem__ function 3 3 4 Called the __setitem__ function 5 Point is (3,6) 6 Called the __getitem__ function 7 There is no this item in class Point 8 9 Process finished with exit code 0
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Python学习之旅(十二)
下一篇:进程、线程和协程
- python_字符串方法 2019-08-13
- python_公共方法 2019-08-13
- python3 之 判断闰年小实例 2019-08-13
- python爬虫常用库 2019-08-13
- pycharm查看函数用法,参数信息的设置方法 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash