目录
- 一、内置属性
__slots__
。- 1.如果没有这句
__slots__ = ['name']
代码,正常情况下是可以添加属性的。 - 2.写了属性限制。
- 3.现在只能添加name这一个属性。
- 4.如果这个
__slots__ = ['name']
没写,它会有个__dict__
属性。 - 5.如果写了
__slots__ = ['name']
,这个__dict__
属性就不会存在。
- 1.如果没有这句
- 二、
__slots__
的作用。- 1.限制类对象的属性,只能添加哪些属性。
- 2.节约内存。
- 三、定义多个属性。
- 1.初始化多个。
- 2.不需要初始化的,动态添加多个。
一、内置属性__slots__
自己定义一个类,事先定义一个__slots__
属性,创建一个对象的时候,这个对象就不会自动生成__dict__
属性了。这个是关于节约内存方面的东西。
__slots_
:限制对象的属性。
指定类对象所能绑定的属性:__slots__ = []
。
1.如果没有__slots__ = ['name']这句代码,正常情况下是可以添加属性的:
代码语言:javascript复制
# __slots_
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
# __slots__ = ['name']
pass
b=Base()
b.age=200
运行结果
2.写了属性限制:
代码语言:javascript复制# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
__slots__ = ['name']
pass
b=Base()
b.age=200
运行结果
不能添加age属性。
3.现在只能添加name这一个属性:
代码语言:javascript复制# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
__slots__ = ['name']
pass
b=Base()
# b.age=200
b.name="qinghan"
运行结果
只能添加这个属性不会报错,如果添加其它的属性,添加不上。
4.如果这个__slots__ = ['name']
没写,它会有个__dict__
属性:
代码语言:javascript复制# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
# __slots__ = ['name']
pass
b=Base()
# b.age=200
b.name="qinghan"
print(b.__dict__)
运行结果
5.如果写了__slots__ = ['name']
,这个__dict__
属性就不会存在:
代码语言:javascript复制# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
__slots__ = ['name']
pass
b=Base()
# b.age=200
b.name="qinghan"
print(b.__dict__)
运行结果
二、__slots__
的作用
1.限制类对象的属性,只能添加哪些属性。 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
1.如果写了__slots__ = ['name']
,这个和实例化有冲突。
代码语言:javascript复制
# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
# 1.限制类对象的属性,只能添加哪些属性。
# 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
__slots__ = ['name']
def __init__(self,name,age):
self.name=name
self.age=age
pass
b=Base("qinghan","18")
# b.age=200
# b.name="qinghan"
# print(b.__dict__)
运行结果
init方法报错了。限定之后,只能为这个对象绑定这个属性,其它的属性再也绑定不上去了。
2.节约内存
通过这个类创建了一个对象,这个时候Python会自动生成一个__dict__
。__dict__
是个字典,关于字典的话,首先它会划出一块比较大的空间。
图例
接下来往里面添加属性,每绑定一个属性,就会记录到__dict__
里面。每生成一个对象,就会划一个区间存这个对象的__dict__
属性。
比如自动化用例,假如有成千上万条用例,然后全部赋值到对象身上去,这个时候它会划成千上万块区间存储每个对象的__dict__
属性。
图例
创建的对象越多,占用的内存越多。在类里面定义slots属性,通过这个类创建对象的时候,这个对象的属性已经限定在slots里面了。
不管是哪个对象,它的属性都只能是这个属性,这个时候只需要一个slots储存所有对象的属性。
所有对象的属性都用slots限制了。当你访问这个属性的时候,属性就在slots里面,slots给你指向对应的属性值。对应的对象,对应的slots属性值。
__dict__
相对于slots,消耗内存是非常大的。定义slots之后,就不会自动创建__dict__
了。
所以创建一个类的时候,知道这个类有多少个属性。这个类创建的对象有多少个属性,在后面不会动态添加属性的情况下,就通过 __slots__
来限定类的属性。前提是后续不会对这个类进行动态属性添加。这种情况下,进行内存的优化。
三、定义多个属性
定义多个属性:__slots__ = ['name','age','gender']
1.初始化多个
代码语言:javascript复制
# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
# 1.限制类对象的属性,只能添加哪些属性。
# 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
__slots__ = ['name','age','gender']
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
pass
b=Base("qinghan","18","ceshi")
# b.age=200
# b.name="qinghan"
# print(b.__dict__)
运行结果
2.不需要初始化的,动态添加多个
代码语言:javascript复制
# __slots__
#限制对象的属性。
class Base(object):
#指定类对象所能绑定的属性。
# 1.限制类对象的属性,只能添加哪些属性。
# 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
__slots__ = ['name','age','gender']
# def __init__(self,name,age,gender):
# self.name=name
# self.age=age
# self.gender=gender
pass
# b=Base("qinghan","18","ceshi")
b=Base()
b.age=200
b.name="qinghan"
b.gender="ceshi"
# b.name="qinghan"
# print(b.__dict__)
运行结果
除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。