在类的顶层设置 __slots__=[字符串属性名称]可以严格限制类属性的引用和赋值。
1、class SS:
__slots__=['a','b']
r=SS()
r.a=1 #正常赋值
r.b=2 #正常赋值
r.c=3 #属性错误,没有属性c
这种做法虽然违背了Python的动态性精神,但有时候是必须的。
2、如果想要保持动态性的解决办法就是在__slots__中添加手动'__dict__'属性;
class SS:
__slots__=['a','b','__dict__']
r=SS()
r.a=1 #正常赋值
r.b=2 #正常赋值
r.c=3 #正常赋值
但是
r.__dict__ #显示为{'c':1}没有'a','b'属性,因为他们是限制性属性不在字典属性里。要调用话,可以用getattr方法
getattr(r,'a') #显示为 1
getattr(r,'c') #显示为3
3、基于以上原因,正确访问类所有属性的方法应该为:
for attr in list(getattr(r,'__dict__'),[])+getattr(r,'__slots__',[]):
print(attr,'=>',getattr(r,attr))
#显示:
a=>1
b=>2
c=>3
__dict__=>{'c':3}