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

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

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

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

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

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

  1. class test:
  2. def __init__(self,name):
  3. self.name=name
  4. def __del__(self):
  5. print('我执行啦')
  6.  
  7. test1=test('haha')
  8. del test1.name
  9. print('------------')
  10. # ------------
  11. # 我执行啦

__enter__和__exit__

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

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

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

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

  1. class A
  2. pass
  3. class B
  4. x=A()

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

python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、的更多相关文章

  1. python类学习以及mro--多继承属性查找机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 还记得什么是新式类和旧式类吗? Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个c ...

  2. 第8.11节 Python类中记录实例变量属性的特殊变量__dict__

    一. 语法释义 调用方法:实例. __dict__属性 __dict__属性返回的是实例对象中当前已经定义的所有自定义实例变量的名和值,用字典存储,每个元素为一个"实例变量名:值" ...

  3. python类的内置attr属性

    class Foo: x=1 def __init__(self,y): self.y=y def __getattr__(self, item): print('----> from geta ...

  4. Python类的构成元素

    类的构成元素 公共属性:实例化时无需__init__方法绑定到对象,就可以直接使用:普通属性:实例化时 需要__ini__方法绑定到对象之后,才可以直接使用:私有属性:__sex 双下滑杠开头,需要在 ...

  5. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

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

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

  7. python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

    网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...

  8. python 类的属性__slots__ (了解一点点)

    当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性, 优点: 1)更快的属性访问速度 2)减少内存消耗 3)限定一个类创建的实例只能有固定的实例属性(实例变量),不允许对象添加 ...

  9. Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

随机推荐

  1. crontab-rsync

    写一个shell脚本放到crontab中,该脚本利用rsync把远程同步到本地的话,需要把本地的公钥放到远程的authorized_keys:否则,手动执行脚本没问题,但是crontab执行就不会有效 ...

  2. conda常用命令

    1. conda基本命令 检查Anaconda是否成功安装 conda --version 检测目前安装了哪些环境 conda info --envs 检查目前有哪些版本的python可以安装: co ...

  3. Tensorflow检验GPU是否安装成功 及 使用GPU训练注意事项

    1. 已经安装cuda但是tensorflow仍然使用cpu加速的问题 电脑上同时安装了GPU和CPU版本的TensorFlow,本来想用下面代码测试一下GPU程序,但无奈老是没有调用GPU. imp ...

  4. 梯度下降法(BGD、SGD)、牛顿法、拟牛顿法(DFP、BFGS)、共轭梯度法

    一.梯度下降法 梯度:如果函数是一维的变量,则梯度就是导数的方向:      如果是大于一维的,梯度就是在这个点的法向量,并指向数值更高的等值线,这就是为什么求最小值的时候要用负梯度 梯度下降法(Gr ...

  5. MySQL--8MySQL存储过程小结

    CURD: 就是对数据表进行插入更新删除查找的操作. 预编译:第一次会分析语法是否正确,编译成可识别的命令.然后存在内存中,以后再调用就省去了这两步,效率变高. 第一点:在存储过程内可以写控制语句,可 ...

  6. Docker ssh server

    这个话题真让我气愤啊,在家里的mac上我已经全部摆平了,结果在公司的Linux上就给堵住了 原因不祥,但最后在错误提示里,有个移除(remove)信息,我照做了,就没问题了,全通了 大概是linux里 ...

  7. php开启慢日志

    默认是以本机的安装路径 cd /usr/local/php/etc/ vim php-fpm.conf ; The log file for slow requests ; Default Value ...

  8. oracle查询数据字典的sql

    使用的sql语句如下: select t1.username 用户, t2.TABLE_NAME 表名称, t3.comments 表业务含义, t2.COLUMN_NAME 字段名称, t4.com ...

  9. Python全栈-day5-数据类型

    一.元组 1.元组基础 1)定义:不可变的‘列表’,定义方式(元素1,元素2.......) 2)用途:存多个值,但是只能读不能写 注意:元组的不可变指的是元组内元素id的不可变 t = (11,2, ...

  10. 【转】查看sqlserver被锁的表以及如何解锁

    查看被锁表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys. ...