python __slots__

原创 2008年05月03日 21:38:00
python新模式的class,即从object继承下来的类有一个变量是__slots__,slots的作用是阻止在实例化类时为实例分配dict,默认情况下每个类都会有一个dict,通过__dict__访问,这个dict维护了这个实例的所有属性,举例如下
class base(object):
    v = 1
    def __init__(self):
          pass

b = base()
print b.__dict__
b.x = 2
print b.__dict__
运行:
{}
{'x':2}
可见:实例的dict只保持实例的变量,对于类的属性是不保存的,类的属性包括变量和函数。由于每次实例化一个类都要分配一个新的dict,因此存在空间的浪费,因此有了slots,当定义了slots后,slots中定义的变量变成了类的描述符,相当于java,c++中的成员变量声明,类的实例只能拥有这些个变量,而不在有dict,因此也就不能在增加新的变量
class base(object):
   __slots__ = ('y')
    v = 1
    def __init__(self):
          pass

b = base()
print b.__dict__
b.x = 2              //error,不能增加新的变量
print b.__dict__

注意,如果类的成员变量与slots中的变量同名,
class base(object):
    __slots=('y',)
   y = 2
    v = 1
    def __init__(self):
          pass

b = base()
print b.__dict__
b.x = 2
b.y = 3 //read only
print b.__dict__

目前的实现是该变量被设置为readonly!!!

Notes on using __slots__

  • Without a __dict__ variable, instances cannot be assigned new variables not listed in the __slots__ definition. Attempts to assign to an unlisted variable name raise an AttributeError. If dynamic assignment of new variables is desired, then add '__dict__' to the sequence of strings in the __slots__ declaration. (Changed in Python version 2.3)
  • Without a __weakref__ variable for each instance, classes defining __slots__ do not support weak references to its instances. If weak reference support is needed, then add '__weakref__' to the sequence of strings in the __slots__ declaration. (Changed in Python version 2.3)
  • __slots__ are implemented at the class level by creating descriptors ( 3.4.2.2) for each variable name. As a result, class attributes cannot be used to set default values for instance variables defined by __slots__; otherwise, the class attribute would overwrite the descriptor assignment.
  • If a class defines a slot also defined in a base class, the instance variable defined by the base class slot is inaccessible (except by retrieving its descriptor directly from the base class). This renders the meaning of the program undefined. In the future, a check may be added to prevent this.
  • The action of a __slots__ declaration is limited to the class where it is defined. As a result, subclasses will have a __dict__ unless they also define __slots__.
  • __slots__ do not work for classes derived from "variable-length" built-in types such as long, str and tuple.
  • Any non-string iterable may be assigned to __slots__. Mappings may also be used; however, in the future, special meaning may be assigned to the values corresponding to each key.

python __slots__ 详解(上篇)

python __slots__ 内存优化
  • sxingming
  • sxingming
  • 2016年10月23日 10:55
  • 2743

python中的__slot__

By default, instances of both old and new-style classes have a dictionary for attribute storage. Thi...
  • way88liu
  • way88liu
  • 2014年12月09日 15:12
  • 2606

python __slots__

python新模式的class,即从object继承下来的类有一个变量是__slots__,slots的作用是阻止在实例化类时为实例分配dict,默认情况下每个类都会有一个dict,通过__dict_...
  • tianqio
  • tianqio
  • 2008年05月03日 21:38
  • 14499

python __slot__的用法

__slots__魔法 在Python中,每个类都有实例属性。默认情况下Python用一个字典来保存一个对象的实例属性。这非常有用,因为它允许我们在运行时去设置任意的新属性。 然而,对于有...
  • qq_35636311
  • qq_35636311
  • 2017年10月16日 12:47
  • 285

Python的__slots__

__slots__ 用处__slots__的作用是阻止在实例化类时为实例分配dict,默认情况下每个类都会有一个dict,通过__dict__访问,这个dict维护了这个实例的所有属性。代码:# co...
  • hihozoo
  • hihozoo
  • 2016年04月26日 11:03
  • 884

Python __slots__的作用

Python __slots__的作用我们都知道一般的对象我们可以动态的往对象中添加属性,例如:class A: def __init__(self, name): ...
  • a540366413
  • a540366413
  • 2017年02月26日 11:07
  • 239

Python __slots__ 作用

在Python中,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,当你需要限制可绑定的实例的属性的时候, 就可以使用__slots__。如: class...
  • u010733398
  • u010733398
  • 2016年10月13日 08:43
  • 429

__slots__魔法

在Python中,每个类都有实例属性。默认情况下Python⽤⼀个字典来保存⼀个对象的实例 属性。这⾮常有⽤,因为它允许我们在运⾏时去设置任意的新属性。 然⽽,对于有着已知属性的⼩类来说,它可能是...
  • weixin_37016700
  • weixin_37016700
  • 2017年01月16日 12:42
  • 114

Python3基础(七) I/O操作

一个程序可以从键盘读取输入,也可以从文件读取输入;而程序的结果可以输出到屏幕上,也可以保存到文件中便于以后使用。本文介绍Python中最基本的I/O函数。 一、控制台I/O 读取键盘输入 内...
  • lisong694767315
  • lisong694767315
  • 2014年08月14日 21:35
  • 8948

Python学习笔记 __slots__ 限制类属性

Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class能添加的属性>>> obj = object() >>> obj.name = "whatever" Trace...
  • u010663768
  • u010663768
  • 2016年12月28日 23:46
  • 94
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python __slots__
举报原因:
原因补充:

(最多只允许输入30个字)