__slots__在python中是扮演属性声明(Attribute Declaration)的角色,当然属性本身不用声明,只需要在使用前赋值即可,但是实际上,属性的应用远非在使用前赋值就行,所以有attribute declaration, attribute accessor,attribute management 等概念,本文对__slots__属性声明做一个学习总结,其他的之后会陆续总结。

(1)Why __slots__?

__slots__用来限制类的实例的属性,优化内存(为每个实例都分配命名空间,如果很多实例被建立起来,然而需要较少的属性,就会很浪费内存空间,所以,python对每个slot 属性在每个实例中都保留了足够空间),防止出现码字错误(typos)等。

但是,它也打破了python核心的动态性质,比如,任何命名通过赋值就可以创建,因此它们应当在非常清楚的真的需要的时候使用,引用python 手册的原话:

Best reserved for rare cases where there are large numbers of instances in a memory-critical application.

(2)__slots__基本用法

__slots__用在新类型类中(New-Style class)是类属性,为列表,其中包含了该类实例的属性,类实例化后,仅允许创建在__slots__列表中的属性,如果定义的属性不在其中,则抛出AttributeError异常。以下代码简单的展示了其基本用法:

>>> class c:
__slots__=['a','b'] >>> x=c()
>>> x.a
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
x.a
AttributeError: a
>>> x.a=1
>>> x.b=2
>>> x.a,x.b
(1, 2)
>>> x.c=8
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
x.c=8
AttributeError: 'c' object has no attribute 'c'

(3)注意事项

(a)__slots__与命名空间字典__dict__

有slots的实例,有些根本就没有__dict__属性,有些实例的属性不在__dict__中。接上面代码,继续...

>>> x.__dict__
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
x.__dict__
AttributeError: 'c' object has no attribute '__dict__'

而没有命名空间字典(namespace dictionary)__dict__,就意味着不可能为实例创建一个不在slots中的属性,怎么办?可以通过把__dict__也写到__slots__中来解决。

>>> class c:
__slots__=['a','b','__dict__'] >>> x=c()
>>> x.a=1;x.b=2;x.c=3
>>> x.a,x.b,x.c
(1, 2, 3)
>>> x.__dict__
{'c': 3}

可以看到可以创建一个x.c,而c不在slots中,在__dict__中。而getattr方法可以对slots中的属性进行访问。接上面代码:

>>> getattr(x,'a');getattr(x,'b')
1
2

(b)在超类(superclass)中的多重__slot__

__slots__是一个类属性,所以子类的slots会继承父类的slots。

>>> class E:
__slots__=['c','d'] >>> class D(E):
__slots__=['a','__dict__'] >>> x=D()
>>> x.a=1;x.c=2;x.d=3;x.e=8
>>> x.a,x.d,x.c,x.e
(1, 3, 2, 8)

浅谈__slots__的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

随机推荐

  1. 十五 JSP开发模式&MVC设计模式

    JSP开发模式: JavaBean + JSP  : 缺点:页面代码过多,不利于维护,JSP页面代码变得臃肿 Servlet + JavaBean + JSP :MVC设计模式 M:model   模 ...

  2. Eclipse设置jvm参数的三种方式

    方式1. 修改Elipse运行JRE默认JVM参数打开Eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面 ...

  3. python-python基础6(面向对象)

    一.面向对象编程 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马 ...

  4. Compile-kernel-module

    Compile-kernel-module 1. 内核模块编程1.1 简介1.2 加载内核模块1.3 最简单的模块1.4 模块必要信息1.4.1 内核模块必须至少包含的头文件:1.4.2 内核模块必须 ...

  5. php+ajax 实现无限树列表

    首先介绍我实现的是xhprof插件的日志转为无限树状图,先看效果图: 废话不多说,直接看代码:(辛辛苦苦敲了好久才搞定,逻辑比较多,新手多揣摩) 控制器: 1 <?php 2 3 namespa ...

  6. 008.CI4框架CodeIgniter, Controller控制器传输参数到View视图

    01. 在CI4中输出VIEW视图,并且传入参数,代码如下: <?php namespace App\Controllers; class Home extends BaseController ...

  7. Ceph 概念理解

    简介 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务. 在虚拟化领域里,比较常用到的是Ceph的块设备存储, ...

  8. MYSQL登录及常用命令

    1.mysql服务的启动和停止 mysql> net stop mysql mysql> net start mysql 2.登陆mysql mysql> 键入命令mysql -ur ...

  9. 08 SSM整合案例(企业权限管理系统):09.用户和角色操作

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 09.用户和角色操作 1. 用 ...

  10. C#常用类库简介(二)

    原文出处:http://blog.csdn.net/weiwenhp/article/details/8140503 C#常用类库简介(一)的地址 System与mscorlib这两个dll中的类库是 ...