- 【python】魔术方法
- 前言
- 一、初始化方法__init__
- 二、构造方法__new__
- 三、析构方法__del__
- 四、__str__
- 五、其他
前言 python面向对象的类中不需要调用而在特定情况下自动触发的方法叫做“魔术方法”
一、初始化方法__init__
·触发机制:通过类实例化对象后,自动触发
·作用:初始化,如属性的赋值
·参数: self接收当前对象,可添加其他参数
class Person:
def __init__(self, name,age):
self.name = name
self.age=age
print('=========>init')
#实例化
p=Person('小红',10)
print(p.name,p.age)
'''
输出:
=========>init
小红 10
'''
二、构造方法__new__
·触发机制:实例化对象时就自动触发,在__init__之前
·作用:管理控制对象的创建过程
·参数: cls接收当前类,其他参数根据初始化方法的参数进行决定
·返回值: 可有可无,没有返回值的时候,实例化结果为None。即想要创建对象,则必须返回object.new(cls)<----开辟的新地址
·注意:__new__的参数要和__init__的参数保持一致,除了(slef和cls不一样),必须返回object.new(cls)才能实例化对象
·应用:单例模式
class Person:
def __init__(self, name,age):
self.name = name
self.age=age
print('=========>init',self)
def __new__(cls, *args, **kwargs): #作用:负责开辟地址,返回地址给self,为了和__init__的参数保持一致,最好写成不定参数*args,**kwargs
print('=========>new')
address=object.__new__(cls) #开辟空间
print(address)
return address #返回地址给 __init__的 self
#实例化
p=Person('小红',10)
print(p)
'''
输出:
=========>new
0x0000021A5AC3FAF0
=========>init 0x0000021A5AC3FAF0
0x0000021A5AC3FAF0
'''
可以发现self的地址和address以及p对象的地址相同的,若是__new__不开辟地址,则实例化结果就是None,即不会成功实例化:
class Person:
def __init__(self, name,age):
self.name = name
self.age=age
print('=========>init',self)
def __new__(cls, *args, **kwargs):
print('=========>new')
#实例化
p=Person('小红',10)
print(p)
'''
输出:
=========>new
=========>init None
None
'''
三、析构方法__del__
(1)对象赋值:p=Person(),p1=p,只要有对象赋值,说明p与p1指向同一地址
(2)删除地址的引用:del p 删除p对对地址的引用
(3)查看地址的引用次数:count=sys.getrefcount( p)
(4)当一块空间没有任何引用次数的时候,默认执行__del__.出现‘仍有引用时,仍打印__del__’的解释:python解释器会回收在本次执行过程中使用的所有空间,清空后,自然会调用__del__
class Person:
def __init__(self, name,age):
self.name = name
self.age=age
print('=========>init')
def __new__(cls, *args, **kwargs):
print('=========>new')
address=object.__new__(cls) #开辟空间
return address #返回地址给 __init__的 self
def __del__(self):
print('========>end')
#实例化
p=Person('小红',10)
'''
输出:
=========>new
=========>init
========>end 解释器回收对象,触发__del__
'''
四、str
·触发机制:在打印对象print(obj)时,触发
·作用:打印对象print(obj)时返回想要得到的信息
class Person:
def __init__(self, name,age):
self.name = name
self.age=age
print('=========>init')
def __new__(cls, *args, **kwargs):
print('=========>new')
address=object.__new__(cls) #开辟空间
return address #返回地址给 __init__的 self
def __del__(self):
print('========>end')
def __str__(self):
return '__str__'+self.name # 返回想要看到任何的内容
#实例化
p=Person('小红',10)
prin(p)
'''
输出:
=========>new
=========>init
'__str__'小红
========>end 解释器回收对象,触发__del__
'''
五、其他
。。。。



