知识点
__slots__
是一个特殊的变量,可以在类中定义,它限制了一个类可以拥有的属性。
通常情况下,Python的类允许动态地添加新的属性,这是因为类默认会使用一个字典来存储实例的属性。但是如果你有一个大量实例的类,而且你知道它们只需要一小组特定的属性,使用__slots__
可以节省内存,因为它不再需要为每个实例存储一个字典。
下面是一个示例:
class Person:
__slots__ = ('name', 'age') # 允许实例只有 'name' 和 'age' 两个属性
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
# 创建一个Person实例
p = Person('John Doe', 30)
# 正常使用
p.say_hello() # 输出: Hello, my name is John Doe and I am 30 years old.
# 试图创建一个额外的属性会引发 AttributeError
p.email = 'john@example.com' # AttributeError: 'Person' object has no attribute 'email'
在上面的例子中,__slots__
限制了 Person
类的实例只能拥有 name
和 age
两个属性,因此尝试创建额外的属性会引发 AttributeError
。
需要注意的是,__slots__
只对当前类的实例起作用,对其子类并不起作用。如果子类也定义了 __slots__
,那么它的实例将受到子类定义的 __slots__
限制。
学习测试代码
"""
# -*- coding: utf-8 -*-
# @Time : 2023/9/21 9:06
# @Author : 王摇摆
# @FileName: practice1.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44943389?type=blog
"""
'''
在本实例中测试slot函数的使用和操作
'''
class Student:
__slots__ = ['name', 'score']
class MasterStudent(Student):
pass
if __name__ == '__main__':
student = Student()
# 1. 对slot槽函数的测试
student.name = 'wangguowei'
print(student.name)
try:
# student.age = 100 # 尝试绑定槽之外的属性
a=1
except AttributeError as e:
print('Error is ' + e)
# 2. 当类与类之间发生继承关系的时候,可以使用槽之外的属性
print()
master = MasterStudent()
master.score = 100
print(master.score)