Python常用特殊方法实例总结
本文实例讲述了Python常用特殊方法。分享给大家供大家参考,具体如下:
1__init__和__new__
__init__方法用来初始化类实例;__new__方法用来创建类实例。
主要的区别:
1).__init__通常用于初始化一个新实例,控制初始化的过程,发生在类实例被创建完以后。它是实例级别的方法。
2).__new__通常用于控制生成一个新实例的过程。它是类级别的方法。
__new__具体的作用:
1)继承一些不可变的class时(比如int,str,tuple),提供一个自定义这些类的实例化过程的途径
2)实现自定义的metaclass
例子:实现永远返回正数
classPositiveInteger(int):#继承类int def__new__(cls,value): returnsuper().__new__(cls,abs(value))#返回父类的__new__方法 i=PositiveInteger(-3)#类实例化 print(i) 3
注意点:
关于__init__方法:第一个参数必须是self;无返回值
关于__new__方法:
1)继承自object的新式类才有__new__
2)__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
3)__new__必须要有返回值,返回实例化出来的实例(也就是__init__的self),可以返回父类__new__出来的实例,或者直接是object的__new__出来的实例
2__del__方法
当对象所有的引用都被删除后触发该方法,代码如下:
classTestdel(): def__del__(self): print("using__del__") t=Testdel() t1=t delt1 delt using__del__
3__str__和__repr__
__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员
定义__repr__的简单方法:定义了__str__之后,赋值给__repr__,如下:
__repr__=__str__
4属性访问
__getattr__(self,name):当用户试图获取一个不存在的属性(name)时的行为
__getattribute__(self,name):当类的属性被访问时的行为
__setattr__(self,name,value):当一个属性被设置时的行为
__delattr__(self,name):当一个属性被删除时的行为
死循环陷阱:
classRectangle: def__init__(self,width=0,height=0): self.width=width self.height=height def__setattr__(self,name,value): ifname==‘square': self.width=value self.height=value else: self.name=value defgetArea(self): returnself.width*self.height r=Rectangle(3,4)
实例化r=Rectangle(3,4)就会出现死循环,因为在__init__里面出现了设置属性值,跳到__setattr__里面e的self.name=value这一句,也就是继续赋值操作self.width=width,所以进入死循环。解决方法:
1)else子句改为:super().__setattr__(name,value)
2)else子句改为:self.__dict__[name]=value
5描述符:将某种特殊类型的类的实例指派给另一个类的属性
特殊类型是指:
__get__(self,instance,owner):访问属性,返回属性的值
__set__(self,instance,value):用于设置属性,不返回任何内容
__delete__(self,instance):删除属性,不返回任何内容
self:描述符类本身的实例,instance:拥有者类的实例,owner:拥有者,类本身
classMyDecriptor: def__get__(self,instance,owner):#理解selfinstanceowner的含义 print(‘getting...',self,instance,owner) def__set__(self,instance,value): print(‘setting…',self,instance,value) def__delete__(self,instance): print(‘deleting…',self,instance) classTest: x=MyDecriptor() test=Test()#实例化 test.x test.x=‘X-man' deltest.x
关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。