常规情况下,类的属性字典是共享的,而实例的字典是独立的。如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间。对这样的类来说,为了节省内存空间,可以使用__slots__类变量代替__init__()来存储数据属性。

定义__slots__之后,系统会为实例使用一种更加紧凑的内部表示,即通过一个很小的固定大小的数组来构建,而不是为每一个实例定义一个字典。

__slots__可以是列表、元组、字符串等可迭代对象

定义__slots__之后,类保留有__dict__,但实例没有,取代的是__slots__,且实例不能增加__slots__定义之外的属性。

class animal:__slots__ = ('name','age')def eat(self):print('%s is eating'%self.name)cat=animal()
print(animal.__dict__)#实例还是有__dict__的
# print(cat.__dict__)会报错,实例已经没有__dict__字典了
print(cat.__slots__)  #('name', 'age'),只返回数据属性名称,不返回对应的值
cat.eat()
#cat.sex='male'会报错,不能为实例增加除了__slots__定义之外的属性了

__del__析构函数,在实例被删除、或者整个python文件执行完毕后自动执行,释放空间。

class test:def __init__(self,name):self.name=namedef __del__(self):print('我执行啦')test1=test('haha')
del test1.name
print('------------')
# ------------
# 我执行啦

class test:def __init__(self,name):self.name=namedef __del__(self):print('我执行啦')test1=test('haha')
del test1
print('------------')
# 我执行啦
# ------------

class test:def __init__(self,name):self.name=namedef __del__(self):print('我执行啦')test1=test('haha')
print('------------')
# ------------
# 我执行啦

__enter__和__exit__

在通过类()对类实例化时,触发类的__enter__方法,操作错误或完毕触发__exit__方法

描述符:在一个类中,定义一个类属性为另一个类的实例,如下在B类中定义类属性x值为A的实例,则A类为描述符。

描述符中可定义__get__方法,获取值时触发,__set__方法,设置值时触发,__delete__删除值时触发。

如果A类中实现了__get__和__set__方法,那么A为数据描述符,如果没有实现__set__方法则为非数据描述符。

class A:pass
class B:x=A()

优先级:类属性>数据描述符>实例属性>非数据描述符>找不到

转载于:https://www.cnblogs.com/Forever77/p/10100066.html

python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、相关推荐

  1. python——类和对象之__dict__属性的使用

    在 Python 类的内部,无论是类属性还是实例属性,都是以字典的形式进行存储的,其中属性名作为键,属性值作为对应的值. __dict__,可以使用类名或者类的实例对象来调用, 用类名直接调用__di ...

  2. python 类的特殊成员(属性和方法)

    在 Python 类中有些方法名.属性名的前后都添加了双下画线,这种方法.属性通常都属于 Python 的特殊方法和特殊属性,开发者可以通过重写这些方法或直接调用这些方法来实现特殊的功能. 最常见的特 ...

  3. python——类和对象之私有属性

    私有属性:不能在类的外部使用,只能在类的内部使用 表示:在属性名前加2个__,例如self.__name=name 例如: 当对象stu调用实例属性时会报错: 报错信息为: AttributeErro ...

  4. python 类-Python 类class定义 方法与属性教程

    Python中的类(Class)是一个抽象的概念,比函数还要抽象,这也就是Python的核心概念,面对对象的编程方法(OOP),其它如:Java.C++等都是面对对象的编程语言. 面对对象(oop)中 ...

  5. python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...

    python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...

  6. 一文讲全了Python 类和对象内容

    摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan  . Pytho ...

  7. 【python进阶】类的__slots__属性

    python作为一门动态语言,可以在对象创建后动态的添加属性和方法. 示例1:动态添加属性 class Dog(object):def __init__(self, name, age):self.n ...

  8. 给Python的类和对象动态增加属性和方法

    通常我们会将编程语言分为静态和动态.静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型:动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定.Pytho ...

  9. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

最新文章

  1. 在python中使用json格式存储数据
  2. 如何配置windows下的snmp服务
  3. 黑客攻破网站涂鸦特效(强烈建议看看)
  4. android staticlayout使用讲解,可实现文本绘制换行处理
  5. python eval简介
  6. python中getattr()的用法
  7. WizTree v4.03 最快的磁盘空间分析工具中文便携版
  8. 【Web】CSS(No.18)Css经典案例(二)《畅销书排行榜》
  9. scratch编程植物大战僵尸教程(一)
  10. java+mysql ssm基于协同过滤算法的演唱会平台
  11. 软件工程应届生面试题
  12. JavaScript系列之内置对象Object
  13. 7 125 kHz RFID技术
  14. 杂项-职位-软件测试工程师:软件测试工程师
  15. 学习TDD:TDD的好处
  16. CTypedPtrArray的引用
  17. 李瑞霖:4.21黄金诱多多单被套怎么办?黄金白银操作建议解套
  18. 提高搜狗SR值和关键词排名
  19. 测量地磁场实验-居家物理实验(版)
  20. 【微信小程序】如何上传、提交审核、发布操作

热门文章

  1. OpenCV支持的图像格式
  2. 【ubuntu】vim中鼠标选中时变成 可视模式,不能复制的解决方法
  3. 【Qt】Qt项目常用代码总结
  4. 莹石云存储卡不兼容_继入股无锡好达之后,华为再度入股国产滤波器厂商德清华莹...
  5. Java项目:就业管理系统设计和实现(java+springboot+ssm)
  6. 计算机应用基础学期教学小结,《计算机应用基础》的教学总结及小结.docx
  7. 判定两棵二叉树是否相似以及左右子树交换、层次编号
  8. ios .framework动态库重签名
  9. 在vue中使用vuex,修改state的值示例
  10. l2-22(重排链表)