其实也是无意之中又看到这个东西,这次索性再记一下,免得下次忘记又再看一遍,往复循环浪费了太多时间。

__slots__其实我做项目这么久还没有主动使用过。下面reference有提到这么一句话

Warning: Don’t prematurely optimize and use this everywhere! It’s not great for code maintenance, and it really only saves you when you have thousands of instances.

不要过早优化和到处使用。这会让代码变得难以维护,所以当你真的存储好几千实例的时候再来考虑这个问题吧。

跟下面进入正题 介绍一下__slots__

在申明了__slots__的类里面将不会再有__dict__和__weakref__魔法方法的存在了。我们申明在对象和类中的属性,其实都是存储在__dict__之中的。砍掉了__dict__相当于砍掉了一坨存储字典对象的容器,而且在初始化新类对象的时候,新的对象也不会再有__dict__方法,这样将大大节约一批内存的使用。下面reference节省内存的文章实际上就是通过固定类对象可以使用的属性,砍掉__dict__从而达到节省内存的目的(前提是你真的会实例化成千上万个该对象,比方说user对象之类)。 使用__slots__也有不好的地方,降低了代码的维护性和灵活性,无法再让动态语言的灵活性得到充分展现。

另外__slots__方法不会影响property装饰器装饰的属性。 调用函数也不会受到影响。

class T(object):
# __slots__ = ['name', 'pp', 'l', '__dict__'] def __init__(self):
self.name = 'ahhaa'
self.pp = 'qweqwe'
self.l = 'asdasd' def bb(self):
return 'oy you remember that' @property
def gg(self):
return 'nimei' print T.__dict__
print T().gg

Reference:

http://tech.oyster.com/save-ram-with-python-slots/  Saving 9 GB of RAM with Python’s __slots__

__slots__用法以及优化的更多相关文章

  1. mysql的limit经典用法及优化

    用法一   SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1;   比如这个 ...

  2. MySQL的limit用法及优化(转)

    常规用法: 用法一: OFFSET ; 比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. 用法二: ,; 而这个SQL,limit后面是从第2条开始读,读取1条信息 ...

  3. Postgresql基本用法以及优化注意

    本篇为之前学习PG数据库一些基本操作使用以及优化注意. 比较运算符  = :  <>,!=,<= , <,>=,>: 不能用于null判断; Between: Le ...

  4. __slots__用法

    class Test(object): __slots__ = ("name","age") t = Test() t.name = "老王" ...

  5. Mysql中Join用法及优化

    Join的几种类型 笛卡尔积(交叉连接) 如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录.在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者直接用f ...

  6. Python如何动态的为对象添加方法或属性,__slots__用法

    代码示例如下: import types    #使用MethodType方法需要导入包 class test(object):  #定义 一个test类,包含name属性和f()方法 def __i ...

  7. SQL里IN的用法以及优化

    1.in后条件不多,可以考虑主表建索引,或用union all 代替 2. in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查 ...

  8. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  9. php分享二十:mysql优化

    1:垂直分割 示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段.那么,为什么不把他放到另外一张表中呢 ...

随机推荐

  1. Linux下rz/sz安装及使用方法

    新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz ...

  2. matlab slice

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  3. linux公钥和私钥生成

    1. 路径 cd /root/.ssh 2. 输入命令 ssh-keygen -t rsa  按三次回车 3. 会依次生成  id_rsa 私钥和 id_rsa.pub 公钥 [root@insure ...

  4. AI 判别式模型和生成式模型

    判别式模型(discriminative model) 生成式模型(generative model) 对于输入x,类别标签y:产生式模型估计它们的联合概率分布P(x,y)判别式模型估计条件概率分布P ...

  5. ubuntu install pip

    ubuntu 安装pip sudo apt-get update sudo apt-get upgrade sudo apt-get install python-pip

  6. stream classdesc serialVersionUID = -7218828885279815404, local class serialVersionUID = 1.

    序列化类时出现的异常! 当某一个类实现java.io.Serializable接口时,该类默认会生成一个private static final long serialVersionUID = 1L; ...

  7. 在TerraExplorer中如何批量根据shape多边形对象创建TerrainModify对象?

    其实,在Skyline中TerrainModify对象就是一个特殊类型Polygon对象,他们的Geometry是可以直接交换使用的: <!DOCTYPE html PUBLIC "- ...

  8. Android popupMenu

    popupMenu = new PopupMenu(ActivityHousesNumList.this, imageViewhousesnum1); popupMenu.getMenuInflate ...

  9. Luogu1979 NOIP2013D2T3 华容道 搜索、最短路

    题目传送门 题意:给出一个$N \times M$的棋盘,棋盘上有一些块可以移动,有一些块无法移动.$Q$次询问,每一次询问给出三个块$a,b,c$,将$a$块变为空格,空格旁边可移动的块可以与空格交 ...

  10. WPF-利用Blend写的平面控制闸门开关动画

    原文:WPF-利用Blend写的平面控制闸门开关动画 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/de ...