Py测开《内置属性__slots__》

目录

  • 一、内置属性__slots__

    • 1.如果没有这句__slots__ = ['name']代码,正常情况下是可以添加属性的。

    • 2.写了属性限制。

    • 3.现在只能添加name这一个属性。

    • 4.如果这个__slots__ = ['name']没写,它会有个__dict__属性。

    • 5.如果写了__slots__ = ['name'],这个__dict__属性就不会存在。

  • 二、__slots__ 的作用。

    • 1.限制类对象的属性,只能添加哪些属性。

    • 2.节约内存。

  • 三、定义多个属性。

    • 1.初始化多个。

    • 2.不需要初始化的,动态添加多个。

一、内置属性__slots__

自己定义一个类,事先定义一个__slots__属性,创建一个对象的时候,这个对象就不会自动生成__dict__属性了。这个是关于节约内存方面的东西。

__slots_:限制对象的属性。

指定类对象所能绑定的属性__slots__ = []

1.如果没有__slots__ = ['name']这句代码,正常情况下是可以添加属性的:

# __slots_
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # __slots__ = ['name']
    pass
b=Base()
b.age=200
dbbdf3a97dbacd6c3ca0d7661d55bebc.png
运行结果

2.写了属性限制:

# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
b.age=200
2dadc4e2cfcb4afe76f6b93effb38d23.png
运行结果

不能添加age属性。

3.现在只能添加name这一个属性:

# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"
3b3426dc2ede982654462c363e795048.png
运行结果

只能添加这个属性不会报错,如果添加其它的属性,添加不上。

4.如果这个__slots__ = ['name']没写,它会有个__dict__属性:

# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"
print(b.__dict__)
9da618cbd757f9648ec67993d8900d03.png
运行结果

5.如果写了__slots__ = ['name'],这个__dict__属性就不会存在:

# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"
print(b.__dict__)
0ba81c95956285a498f0fcdc88408ee8.png
运行结果

二、__slots__ 的作用

1.限制类对象的属性,只能添加哪些属性。
2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。

1.如果写了__slots__ = ['name'],这个和实例化有冲突。

# __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__)
f6cd08be2757e657c43f19754818e498.png
运行结果

init方法报错了。限定之后,只能为这个对象绑定这个属性,其它的属性再也绑定不上去了。

2.节约内存

通过这个类创建了一个对象,这个时候Python会自动生成一个__dict____dict__是个字典,关于字典的话,首先它会划出一块比较大的空间。

75d4fe2171ec3eb2ec49dde2f1ec7b92.png
图例

接下来往里面添加属性,每绑定一个属性,就会记录到__dict__里面。每生成一个对象,就会划一个区间存这个对象的__dict__属性。

比如自动化用例,假如有成千上万条用例,然后全部赋值到对象身上去,这个时候它会划成千上万块区间存储每个对象的__dict__属性。

a402931407e94275c3d75ae172abc129.png
图例

创建的对象越多,占用的内存越多。在类里面定义slots属性,通过这个类创建对象的时候,这个对象的属性已经限定在slots里面了。

不管是哪个对象,它的属性都只能是这个属性,这个时候只需要一个slots储存所有对象的属性。

所有对象的属性都用slots限制了。当你访问这个属性的时候,属性就在slots里面,slots给你指向对应的属性值。对应的对象,对应的slots属性值。

__dict__相对于slots,消耗内存是非常大的。定义slots之后,就不会自动创建__dict__了。

所以创建一个类的时候,知道这个类有多少个属性。这个类创建的对象有多少个属性,在后面不会动态添加属性的情况下,就通过 __slots__来限定类的属性。前提是后续不会对这个类进行动态属性添加。这种情况下,进行内存的优化。

三、定义多个属性

定义多个属性:__slots__ = ['name','age','gender']

1.初始化多个

# __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__)
9dded28ef2ba840f7720e49707a95cff.png
运行结果

2.不需要初始化的,动态添加多个

# __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__)
a06235432245dfb92211d59e301be9c5.png
运行结果

除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。

公众号 清菡软件测试 首发,更多原创文章:清菡软件测试 168+ 原创文章,欢迎关注、交流,禁止第三方擅自转载。如有转载,请标明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清菡软件测试

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值