python之禅中文,python之父是哪个国家
python通过调用__init__()方法构造当前类的实例化对象。[创建对象时,python解释器默认调用__init__()方法]
__ _ del _ _()方法的作用正好与__init__()方法相反,用来销毁实例化的对象。[删除对象时,python解释器默认调用__del__()方法]
其实在编写程序的时候,如果之前创建的类实例化对象以后不再使用,最好在适当的地方手动销毁它,释放它所占用的内存空间(整个过程称为垃圾回收(简称GC))。
大多数情况下,Python开发者不需要手动收集垃圾,因为Python有自动垃圾收集机制,可以自动销毁不用的实例对象。
示例__del__():使用场景:
1.删除对象时,python parser默认会调用__del__()方法,即在对象引用执行完毕后,python会自动调用__del__()方法。
2.内存中的对象销毁(释放)时回调__del__()方法。
示例1:类语言:
def __init__(self):
Print(调用__init__()方法来构造对象)
def __del__(self):
Print (Call __del__()销毁对象并释放其空间)
clangs=CLanguage()
del clangs的运行结果:
【注1】:不能误认为只要实例对象调用__del__(),实例对象占用的内存空间就会被释放。例如:
类别语言:
def __init__(self):
Print(调用__init__()方法来构造对象)
def __del__(self):
Print (Call __del__()销毁对象并释放其空间)
clangs=CLanguage()
#添加引用clangs对象的实例对象。
cl=金属撞击声
Del clangs #删除实例对象(实际上是实例对象的引用计数减1)
打印( * * * * * * * * * * * * * *)运行结果:上面代码的最后一行输出信息,是在程序执行结束时调用__del__()方法输出的。
说明:当程序中的其他变量(比如上面代码中的cl变量)引用实例对象时,即使手动调用__del__()方法,也不会立即执行该方法。这与Python的垃圾收集机制的实现有关。
Python采用自动引用计数(ARC)实现垃圾收集机制。该方法的核心思想是,每个Python对象都将配置一个计数器,初始Python实例对象的计数器值都将为0。如果变量引用实例对象,计数器值将增加1,依此类推。相反,每当变量取消对实例对象的引用时,计数器将减1。如果Python对象的计数器值为0,则意味着没有变量引用Python对象,也就是说,程序不再需要它。这时候Python会自动调用__del__()方法来回收。
以上面程序中的clangs为例。实际上,构建clangs实例对象的过程分为两步。首先调用该类中的__init__()方法构建该类的一个对象(称之为C,计数器为0),立即使用clangs作为创建的实例对象的引用(C的计数器值为1)。在此基础上,另一个cl变量引用clangs(实际上相当于引用CLanguage(),此时C的计数器再次为1)。此时如果调用del clangs语句,只会导致C的计数器减1(值变成1)。因为C的计数器值不为0,所以C不会被销毁(不会执行__del__()方法)。
再比如:执行del cl语句时,被应用对象实例object C的计数器继续为-1(变成0),Python会自动把计数器为0的实例对象当作垃圾进行回收。
类别语言:
def __init__(self):
Print(调用__init__()方法来构造对象)
def __del__(self):
Print (Call __del__()销毁对象并释放其空间)
clangs=CLanguage()
#添加引用clangs对象的实例对象。
cl=金属撞击声
Del clangs #删除实例对象(实际上是实例对象的引用计数减1)
打印( * * * * * * * * * * * * )
Del cl #删除实例对象(实际上,实例对象的引用计数减1)
打印(-)运行结果:
示例2:类用户:
def __init__(自身,用户名):
self.user=用户名
打印(用户初始化成功-)
定义获取信息(自身):
打印(自己的用户)
def __del__(self):
打印(用户对象被回收-)
if __name__==__main__ :
#创建一个用户对象
u=用户(用户名=XXX )
#删除用户对象
德尔乌
打印( del U -)运行结果:
代码解释:
U=User()在内存中创建一个用户对象,并让变量u引用内存中的用户对象。
U Del删除变量u,此时内存中的用户对象没有对它的变量引用,Python解析器会回调__del__()方法来回收内存。
示例3:类用户:
def __init__(自身,用户名):
self.user=用户名
打印(用户初始化成功-)
定义获取信息(自身):
打印(自己的用户)
def __del__(self):
打印(用户对象被回收-)
if __name__==__main__ :
u1=用户( XXX )
u2=u1
德尔u1
打印( del u1 -)
德尔u2
打印( Delu2 -)运行结果:
代码解析:
U1=用户()创建一个内存来存储用户对象,变量U1指向这个内存。
u2=u1这里创建了一个新的变量U2,U2指的是u1的内存地址。此时u1和u2都引用同一个内存地址。
当del u1删除u1时,变量对用户对象的引用也被删除。此时,由于内存中的用户对象仍被u2引用,所以不会回收内存(不会回调__del__()方法)。
del u2删除u2后,内存中的用户对象没有被引用的变量,然后解释器会回收内存,回调__del__()方法。
例4:当实例对象的引用计数为0时,python解释器会自动调用__del__()销毁对象,回收内存空间。类别用户:
def __init__(自身,用户名):
self.user=用户名
打印(用户初始化成功-)
定义获取信息(自身):
打印(自己的用户)
def __del__(self):
打印(用户对象被回收-)
if __name__==__main__ :
用户( XXX )。get_info()运行结果:
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。