Python中构造函数和析构函数的使用,以及del语句和sys.getrefcount()获得对象的引用次数

参考链接: 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
>>> 
>>> 
>>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值