python__slot__ 说明, __slot__与__dict__

#__slot__ 实例说明
#1.__slot__属于类属性,是一个列表 , 只有列表内的变量名可以成为实例属性
#2.引用前必须先赋值 : print(obj.name) 将出错;
#3.带__slot__的实例 通常情况下没有__dict__词典属性 (object.__dict__ ,error)
class LimitClass:
    __slots__ = ["name","age",'job']
    def __init__(self):
        pass
        #self.a = 100 AttributeError: 'LimitClass' object has no attribute 'a'
limit = LimitClass()
#limit.name     AttributeError: name
limit.name = 'hi' #引用前先赋值
print(limit.name) #ok
#limit.pay = 1  AttributeError: 'LimitClass' object has no attribute 'pay'
#limit.__dict__ AttributeError: 'LimitClass' object has no attribute '__dict__'

如果实例还需要自由的赋值(动态的新增变量) 可以把__dict__ 属性添加进__slot__

#__slot__ 与 __dict__结合 , 实例就可以动态添加属性了
class LimitClass2:
    __slots__ =  ['a','b','c','__dict__'] #__dict__ 以字符串的方式添加进__slot__
l = LimitClass2()
l.a = 'a'       #给__slot__规定的变量名赋值 ; 引用前先赋值
l.free = 'haha' #把free添加到了__dict__
print(l.__dict__)   #{'free': 'haha'}可以看到l.a 并没有加入到__dict__中,free加入了
#接下来查看一下所有的实例属性 ,因为__slot__的原因,不能直接使用__dict__
#第一次方式
for attr in (l.__slots__ + list(l.__dict__)):
    print('attr:%s , value:%s' %(attr,getattr(l,attr,None)))
#第二种:也可以这样来使用(getattr),这样或许更合适更通用
for attr in list(getattr(l,'__dict__',[])) + getattr(l,'__slots__',[]):
    print('=> attr:%s , value:%s' % (attr, getattr(l, attr, None)))


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值