前几天我遇到了一个很奇怪的地方,下面的代码:
class Obj:
pass
obj = Obj()
setattr(obj, '@#^&%$&', None)
实际可行。如果以下内容引发了语法错误,为什么允许这种行为? :
obj.@#^&%$&
答案 0 :(得分:0)
所有setattr
函数所做的就是将给定键处的给定值分配给对象的__dict__
字典。它不会对密钥进行任何验证,因此您可以使用getattr
检索值,如下所示:
getattr(obj, '@#^&%$&')
返回您分配给所述键的值:
None
但是,点符号后的属性名称不是加引号的字符串的一部分,因此必须遵循Python命名语法,否则解释器无法正确解析它。