字典位于实例的“心脏”,__dict__属性跟踪所有实例属性。举例来说,你有一个实例inst,它
有一个属性foo,那使用inst.foo来访问它与使用inst.__dict__['foo']来访问是一致的。
字典会占据大量内存,如果你有一个属性数量很少的类,但有很多实例,那么正好是这种情况。
为内存上的考虑,用户现在可以使用__slots__属性来替代__dict__。
基本上,__slots__是一个类变量,任何试图创建一个其名不在__slots__中的名字的实例属性都将
导致AttributeError异常。
>>> class SlottedClass(object):
... __slots__ = ('foo', 'bar')
...
>>> c = SlottedClass()
>>> c.foo = 42
>>> c. xxx = "do"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'SlottedClass' object has no attribute 'xxx'
>>> c.foo
42
>>> c.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: bar
>>>
这种特性的主要目的是节约内存。其副作用是某种类型的“安全”,它能防止用户随心所欲的
动态增加实例属性。带__slots__属性的类定义不会存在__dict__了(除非你在__slots__中增
加'__dict__'元素)
分享到:
相关推荐
在Python中,__slots__属性是类定义中的一个特殊属性,它的目的是为了优化内存使用。通常情况下,Python中定义的类的实例会有一个__dict__属性,用于存储实例的属性和对应的值。但有时这种机制会导致较大的内存开销...
在Python 3中,`__slots__`是一个特殊属性,用于优化类的内存使用和限制实例可以添加的属性。这个特性对于大型应用或者需要频繁创建对象的场景特别有用,因为它可以减少内存开销,提高程序性能。下面我们将深入探讨`...
在Python编程语言中,`__slots__`是一个特殊属性,用于优化类的内存使用和提高性能。当创建一个类的实例时,如果没有定义`__slots__`,Python会为每个实例创建一个`__dict__`字典来存储实例变量。然而,`__dict__`...
为了实现这一目标,Python提供了一个特殊的类属性__slots__,它允许开发者明确地声明实例属性。通过定义__slots__变量,类的实例将只能拥有__slots__中列出的属性,从而达到限制的目的。 __slots__变量是一个元组或...
__slots__的工作原理是告诉Python解释器,对于该类的实例,只需要为指定的属性分配空间,而不是为每个实例都创建一个属性字典。当定义了__slots__后,Python不会为每个实例创建一个__dict__来存储属性,而是直接使用...
在Python编程语言中,__slots__是一个特殊的类属性,它被用于声明类实例能拥有的唯一属性,即类实例只能有__slots__中定义的属性。使用__slots__可以在内存上带来优化,因为Python解释器不需要为每个实例创建__dict_...
本文主要讲解了 Python 中的类和实例绑定属性和方法的机制,以及使用 `__slots__` 限制实例的属性。 首先,我们定义了一个 `Student` 类,创建了一个实例 `s`,然后尝试给实例绑定一个属性 `name` 和一个方法 `set_...
当我们定义一个类时,可以在类定义内部设置`__slots__`变量,它是一个包含字符串的元组,表示允许绑定到该类实例的属性名称。例如: ```python class Student(object): __slots__ = ('name', 'age') ``` 在这个...
2.18 类 2.19 模块 2.19.1 如何导入模块 2.19.2 如何访问一个模块函数或访问一个模块变量 2.20 实用的函数 2.21 练习 第3章 python基础 3.1 语句和语法 3.1.1 注释(#)...
2.18 类 2.19 模块 2.19.1 如何导入模块 2.19.2 如何访问一个模块函数或访问一个模块变量 2.20 实用的函数 2.21 练习 第3章 python基础 3.1 语句和语法 3.1.1 注释(#)...
因此这种默认的做法可以通过在新式类中定义了一个__slots__属性从而得到了解决。__slots__声明中包含若干实例变量,并为每个实例预留恰好足够的空间来保存每个变量,因此没有为每个实例都创建一个字典,从而节省空间...
在这个例子中,`Foo`类声明了`x`, `y`, `z`三个属性,并通过`__slots__`告诉Python不要为实例创建`__dict__`。因此,实例`c`只能拥有`x`, `y`, `z`这三个属性,尝试添加其他未在`__slots__`中声明的属性(如`e`)会...
在Python中,`__slots__`是一个非常有用的特性,它允许用户在类定义中明确指定类的实例能够拥有的属性。这一特性不仅可以帮助开发者更好地控制类的内存使用,还可以提高性能,尤其是在需要创建大量对象的情况下。 #...
2.18 类 2.19 模块 2.19.1 如何导入模块 2.19.2 如何访问一个模块函数或访问一个模块变量 2.20 实用的函数 2.21 练习 第3章 Python基础 3.1 语句和语法 3.1.1 注释(#)...