读者你好,这篇文章将帮助你了解什么是__slots__,它们的优点、缺点和用法。
它被用于类和对象的实现程序中。__slots__是一个类变量,通常被分配一串字符串,这些字符串是实例使用的变量名。使用__slots__的主要目的是为了在程序中更快地访问和节省内存。
在Python中,当我们实现一个类时,一个类会有对象实例,这些对象实例会有属性,所有这些属性都被存储起来。
Python默认生成了__dict__属性来存储某个特定类中所有实例的值。它的实现与Python 中的 dict 数据类型非常相似。
__dict__有助于动态变量的创建,但在某些情况下,它无法捕捉错误。例如,如果在写代码时,你错误地拼错了一个变量名,它不会引发AttributeError,而是会创建一个新的变量。像这样的问题在__slots__中得到了解决。
另外,使用 __slots__ 的对象实例没有一个内置的字典,这有两个好处,第一,访问变量的速度更快,第二,节省了很多内存。它不会为类创建__dict__:
class Example_1_WithoutSlots():
def __init__(self, roll_no, name):
self.roll_no = roll_no
self.name = name
x1 = Example_1_WithoutSlots('1', 'Adam')
print(x1.__dict__)
OUTPUT:
{'roll_no': '1', 'name': 'Adam'}
class Example_2_WithSlots():
__slots__ = ["roll_no", "name"]
def __init__(self, roll_no, name):
self.roll_no = roll_no
self.name = name
x2 = Example_2_WithSlots('1', 'Adam')
print(x2.__dict__)
输出
另外,使用__slots__的对象实例没有一个内置的字典,这使得访问实例的速度更快,而且也节省了内存。为了测试,我们在python中导入timeit来检查两个类中的函数速度。第一个实现的类是没有类的,第二个是有槽的。我们可以清楚地看到两个函数之间的差异。
输出
注意这两个函数所花费的时间的不同。第一个函数每个循环需要268ns,而第二个函数每个循环需要237ns。在像这样的短程序中,差别似乎不大,但当开发者开发一个更大规模的程序时,速度就成为一个主要因素。
结论
Python中的__slots__是一个非常有效的方法,它可以提高程序的速度,并且可以更快地访问属性。它使面向对象的编程更容易。