python对象销毁(垃圾回收)

Python 使用了引用计数这一简单技术来跟踪和回收垃圾。

在 Python 内部记录着所有使用中的对象各有多少引用。

一个内部跟踪变量,称为一个引用计数器。

当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。a = 40      # 创建对象  <40>b = a       # 增加引用, <40> 的计数c = [b]     # 增加引用.  <40> 的计数del a       # 减少引用 <40> 的计数b = 100     # 减少引用 <40> 的计数c[0] = -1   # 减少引用 <40> 的计数

垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

实例

析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行:

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-classPoint:def__init__(self,x=0,y=0):self.x=xself.y=ydef__del__(self):class_name=self.__class__.__name__printclass_name,"销毁"pt1=Point()pt2=pt1pt3=pt1printid(pt1),id(pt2),id(pt3)# 打印对象的iddelpt1delpt2delpt3

以上实例运行结果如下:3083401324 3083401324 3083401324Point 销毁

注意:通常你需要在单独的文件中定义一个类,

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。

通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。

继承语法class 派生类名(基类名)

...

在python中继承中的一些特点:1、如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看:python 子类继承父类构造函数说明。

2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数

3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

语法:

派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:class SubClassName (ParentClass1[, ParentClass2, ...]):

...

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-classParent:# 定义父类parentAttr=100def__init__(self):print"调用父类构造函数"defparentMethod(self):print'调用父类方法'defsetAttr(self,attr):Parent.parentAttr=attrdefgetAttr(self):print"父类属性 :",Parent.parentAttrclassChild(Parent):# 定义子类def__init__(self):print"调用子类构造方法"defchildMethod(self):print'调用子类方法'c=Child()# 实例化子类c.childMethod()# 调用子类的方法c.parentMethod()# 调用父类方法c.setAttr(200)# 再次调用父类的方法 - 设置属性值c.getAttr()# 再次调用父类的方法 - 获取属性值

以上代码执行结果如下:调用子类构造方法调用子类方法调用父类方法父类属性 : 200

你可以继承多个类class A:        # 定义类 A.....class B:         # 定义类 B.....class C(A, B):   # 继承类 A 和 B.....

你可以使用issubclass()或者isinstance()方法来检测。issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)

isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

方法重写

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:

实例:

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-classParent:# 定义父类defmyMethod(self):print'调用父类方法'classChild(Parent):# 定义子类defmyMethod(self):print'调用子类方法'c=Child()# 子类实例c.myMethod()# 子类调用重写方法

执行以上代码输出结果如下:调用子类方法

基础重载方法

下表列出了一些通用的功能,你可以在自己的类重写:序号方法, 描述 & 简单的调用

1__init__ ( self [,args...] )

构造函数

简单的调用方法: obj = className(args)

2__del__( self )

析构方法, 删除一个对象

简单的调用方法 : del obj

3__repr__( self )

转化为供解释器读取的形式

简单的调用方法 : repr(obj)

4__str__( self )

用于将值转化为适于人阅读的形式

简单的调用方法 : str(obj)

5__cmp__ ( self, x )

对象比较

简单的调用方法 : cmp(obj, x)

运算符重载

Python同样支持运算符重载,实例如下:

实例

#!/usr/bin/pythonclassVector:def__init__(self,a,b):self.a=aself.b=bdef__str__(self):return'Vector (%d, %d)'%(self.a,self.b)def__add__(self,other):returnVector(self.a+other.a,self.b+other.b)v1=Vector(2,10)v2=Vector(5,-2)printv1+v2

以上代码执行结果如下所示:Vector(7,8)

类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法

在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods

实例

#!/usr/bin/python# -*- coding: UTF-8 -*-classJustCounter:__secretCount=0# 私有变量publicCount=0# 公开变量defcount(self):self.__secretCount+=1self.publicCount+=1printself.__secretCountcounter=JustCounter()counter.count()counter.count()printcounter.publicCountprintcounter.__secretCount# 报错,实例不能访问私有变量

Python 通过改变名称来包含类名:122Traceback (most recent call last):

File "test.py", line 17, in print counter.__secretCount  # 报错,实例不能访问私有变量AttributeError: JustCounter instance has no attribute '__secretCount'

Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性,参考以下实例:#!/usr/bin/python# -*- coding: UTF-8 -*-class Runoob:

__site = "www.runoob.com"runoob = Runoob()print runoob._Runoob__site

执行以上代码,执行结果如下:www.runoob.com

单下划线、双下划线、头尾双下划线说明:__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

python 对象的销毁_python对象销毁(垃圾回收)相关推荐

  1. python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?

    CPython 中垃圾回收的主要思路 1.维护引用计数器 .对于每一个对象,都有一个对于该对象的引用次数的计数器.如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的 ...

  2. python 对象销毁_python对象销毁实例(垃圾回收)

    python对象销毁实例(垃圾回收) 我就废话不多说了,直接上代码吧! '''python对象销毁(垃圾回收)''' class Point: 'info class' def __init__(se ...

  3. python对象点方法_python对象方法、类方法、静态方法

    1.我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filen ...

  4. python属性访问顺序_Python 对象属性的访问

    在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...

  5. python布尔类型运算_Python对象类型及其运算方法(详解)

    基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = 'abc' >> ...

  6. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

  7. python中的垃圾回收机制_python里面的垃圾回收机制

    1.引用计数机制: python里每一个东西都是对象,它们的核心就是一个结构体:PyObject typedef struct_object { int ob_refcnt; #引用计数 struct ...

  8. python gc教程_python中的垃圾回收(GC)机制

    一.引用计数 Python 垃圾回收以引用计数为主,分代回收为辅.引用计数法的原理是每个对象维护一个ob_refcnt,用来记录对象被引用的次数,也就是用来追踪有多少个引用指向了对象,当发生以下四种情 ...

  9. 简述python垃圾回收机制_python中的垃圾回收机制简述

    2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...

  10. 关于python的垃圾回收机制_Python中的垃圾回收机制

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

最新文章

  1. HDUOJ------Worm
  2. php redis 密码,redis如何设置密码
  3. 淡谈泛型约束T(转)
  4. 编程之美-阶乘方法整理
  5. how is SAP UI5 oContext is determined
  6. 用python处理excel的基本语法_《使用python3读取处理excel表的数据内容如何对内容求平均值》 用python读取excel文件...
  7. 二叉树的相关题(叶子结点个数,最大深度,找特殊值结点(值不重复),判断两个树是否相同,判断两个数是否为镜像树,是否为子树,)
  8. 【C++深度剖析教程26】父子间的冲突
  9. 千牛怎么注销卖家店铺_新店铺怎么拥有亚马逊购物车?亚马逊小卖家如何尽快获得黄金购物车?...
  10. 物联网-移远M26模块OpenCPU开发第1讲
  11. MSSQL同步刷新视图字段长度和源表保持一致
  12. nodejs后台系列--第六篇-把nodejs后台部署到云服务器上面
  13. Qt编写可视化大屏电子看板系统32-模块10大屏地图
  14. fspecial 创建预定义的二维滤波器 (Matlab)
  15. 微型四轴飞行器(3)嵌入式软件设计
  16. 如何成为一名优秀设计师?(锤子科技视觉总监罗子雄演讲实录)
  17. 论坛网站进行帖子保存php,PHPwind论坛专用采集器
  18. 神器大师泰兹瑞与威穆
  19. HTML消息提醒(Notification)
  20. 项目管理(PMP)项目沟通管理

热门文章

  1. Flash ANE打包
  2. em模型补缺失值_缺失值的四种处理方法
  3. Sequence (矩阵快速幂+快速幂+费马小定理)
  4. Scratch软件界面介绍
  5. C#输入身高体重求BMI
  6. html文件上传协议,模拟HTML表单上传文件(RFC 1867)
  7. Convolution1D与Convolution2D区别
  8. flac转mp3的方法
  9. java tld tag_自定义标签tag(jsp编写)和tld(java编写)的使用方法
  10. 某云盘下载工具(IDM,Aria2)速度测试