Python中有哪些常用的特殊方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
1 __init__和__new__
__init__
方法用来初始化类实例;__new__
方法用来创建类实例。
主要的区别:
1).__init__通常用于初始化一个新实例,控制初始化的过程,发生在类实例被创建完以后。它是实例级别的方法。
2).__new__通常用于控制生成一个新实例的过程。它是类级别的方法。
__new__具体的作用:
1) 继承一些不可变的class时(比如int, str, tuple),提供一个自定义这些类的实例化过程的途径
2) 实现自定义的metaclass
例子:实现永远返回正数
class PositiveInteger(int): #继承类int
def __new__(cls, value):
return super().__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__方法
当对象所有的引用都被删除后触发该方法,代码如下:
class Testdel():
def __del__(self):
print("using __del__")
t = Testdel()
t1 = t
del t1
del t
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)
:当一个属性被删除时的行为
死循环陷阱:
class Rectangle:
def __init__(self, width=0, height=0):
self.width = width
self.height = height
def __setattr__(self, name, value):
if name == ‘square':
self.width = value
self.height = value
else:
self.name = value
def getArea(self):
return self.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
:拥有者,类本身
class MyDecriptor:
def __get__(self, instance, owner): #理解self instance owner的含义
print(‘getting...', self, instance, owner)
def __set__(self, instance, value):
print(‘setting…',self, instance,value)
def __delete__(self, instance):
print(‘deleting…',self, instance)
class Test:
x = MyDecriptor()
test = Test() #实例化
test.x
test.x = ‘X-man'
del test.x
Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入门、功能强大,在许多领域中都有广泛的应用,例如最热门的大数据分析,人工智能,Web开发等。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。