__slots__ 用法

slots:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
使用了__slots__之后,实例化的对象,就没有__dict__,即没有自己的名称空间
这就说明,对象将无法添加__slots__定义以外的新属性。
slots 定义的元素,必须是字符串类型,否则运行阶段就会报错
定义了__slots__的类,就失去了继承的功能,如果强制进行继承,__slots__就没有意义了。

常见误区:

关于__slots__的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。
尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。
更多的是用来作为一个内存优化工具

代码示例



# class Bar:
#     def say(self):
#         print(self)

class Foo:
    __slots__ = ["name"]

# class Goo(Foo):
    # pass
f=Foo()
# print(f.__dict__) 调用就会报错,会现实f没有__dict__属性
print(f.__slots__)#可以看到里面的定义的属性
f.name = 1
print(f.name) #如果没有值,就没法调用,会报错
# f.x=1 #没法添加新的属性
# print(f.x)
# print(f.__slots__)
# print(f.__dict__) #如何Foo类继承Bar,那么__slots__就不在起作用,最好不要继承

# g=Goo()
# g.age =1
# print(g.age)
# print(g.__dict__)
# g.name = 1
# print(g.__slots__)

执行结果

['name']
1

转载于:https://www.cnblogs.com/greatkyle/p/6796943.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值