参考链接: 11周精通python计划(完结) 参考链接: sys.getrefcount(object) 参考链接: object.__del__(self) 参考链接: del 语句
代码实验展示:
# 演示析构函数的使用以及sys.getrefcount()的使用
import sys
class Friend(object):
"""自定义的类用来对现实世界中的朋友进行建模""" # 设置文档字符串docstring
count = 0 # 定义类属性,并赋初值
num_friends = 1000 # 定义类属性,并赋初值
print('开始加载类对象Friend'.center(100,'-')) # 类内的可执行语句会被自动执行,但是一般不这样使用
def __init__(self, name, age):
'''初始化属性name和age'''
self.name = name # 定义实例属性,并赋初值
self.age = age # 定义实例属性,并赋初值
Friend.count += 1 # 通过类型名来访问类属性
Friend.num_friends += 1 # 通过类型名来访问类属性
def introduce(self):
print('我是'+self.name+',我的年龄是'+str(self.age)+'.')
def greet(self,person):
print('你好,'+person+',我是'+self.name+'.')
def __del__(self):
""" 定义类的析构函数 """
# Python解释器内部约定,保留方法
# 使用del语句来删除对象且对象被真实删除时调用析构函数__del__()
# 真实删除: 当前对象的引用数为0或者当前程序退出时(垃圾回收)
print('再见,'+self.name+'!',end=' ')
print('对象:Friend(name={}, age={})删除中...'.format(self.name, self.age))
Friend.count -= 1
Friend.num_friends -= 1
print('结束加载类对象Friend'.center(100,'-')) # 类内的可执行语句会被自动执行,但是一般不这样使用
# ------------------------------------------------------------------------------------- #
print('\n主程序开始...')
wyf = Friend('铁凡', 25)
zh = Friend('昊昊', 27)
lzq = Friend('林麻子',26)
print(wyf.count,wyf.num_friends)
print(Friend.count,Friend.num_friends)
print('访问实例方法'.center(100,'-'))
print('\n自我介绍...')
zh.introduce()
wyf.introduce()
lzq.introduce()
print("\n打招呼...")
zh.greet('路人甲')
wyf.greet('路人乙')
lzq.greet('路人丙')
lzq_X = lzq # 增加lzq的一个引用lzq_X,那么即使使用del,也不会删除该对象,因为引用数不为零
print('\n这里并不删除lzq,因为引用数不为零!')
print('当前lzq对象的引用信息...')
print('引用数量(默认会额外+1):',sys.getrefcount(lzq))
print(type(sys.getrefcount(lzq)))
del lzq # 使用del来删除对象且对象被真实删除时调用析构函数__del__()
# 真实删除: 当前对象的引用数为0或者当前程序退出时(垃圾回收)
print(wyf.count,wyf.num_friends)
print(Friend.count,Friend.num_friends)
print('\n这里会删除zh,因为引用数为零!')
print('当前zh对象的引用信息...')
print('引用数量(默认会额外+1):',sys.getrefcount(zh))
del zh
print(wyf.count,wyf.num_friends)
print(Friend.count,Friend.num_friends)
print('\n程序运行结束,垃圾回收机制执行善后处理...\n')
控制台输出结果:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 855 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq> conda activate ssd4pytorch1_2_0
(ssd4pytorch1_2_0) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq> & 'D:\Anaconda3\envs\ssd4pytorch1_2_0\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '58186' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\test4cxq\test_class_2.py'
-------------------------------------------开始加载类对象Friend--------------------------------------------
-------------------------------------------结束加载类对象Friend--------------------------------------------
主程序开始...
3 1003
3 1003
-----------------------------------------------访问实例方法-----------------------------------------------
自我介绍...
我是昊昊,我的年龄是27.
我是铁凡,我的年龄是25.
我是林麻子,我的年龄是26.
打招呼...
你好,路人甲,我是昊昊.
你好,路人乙,我是铁凡.
你好,路人丙,我是林麻子.
这里并不删除lzq,因为引用数不为零!
当前lzq对象的引用信息...
引用数量(默认会额外+1): 3
<class 'int'>
3 1003
3 1003
这里会删除zh,因为引用数为零!
当前zh对象的引用信息...
引用数量(默认会额外+1): 2
再见,昊昊! 对象:Friend(name=昊昊, age=27)删除中...
2 1002
2 1002
程序运行结束,垃圾回收机制执行善后处理...
再见,铁凡! 对象:Friend(name=铁凡, age=25)删除中...
再见,林麻子! 对象:Friend(name=林麻子, age=26)删除中...
(ssd4pytorch1_2_0) PS C:\Users\chenxuqi\Desktop\News4cxq\test4cxq>
代码实验展示:
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import sys
>>>
>>> class Person:
pass
>>>
>>> p1 = Person()
>>> sys.getrefcount(p1)
2
>>> p2 = p1
>>> sys.getrefcount(p1)
3
>>> sys.getrefcount(p2)
3
>>> p3 = p1
>>>
>>> sys.getrefcount(p1)
4
>>> sys.getrefcount(p2)
4
>>> sys.getrefcount(p3)
4
>>> t = sys.getrefcount(p1)
>>> type(t)
<class 'int'>
>>> t
4
>>>
>>>
>>> ls = [0,1,2]
>>> sys.getrefcount(ls)
2
>>>
>>>
>>> s = '01234'
>>> sys.getrefcount(s)
2
>>>
>>> a = 1
>>> a
1
>>> sys.getrefcount(a)
871
>>>
>>>
>>>