Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x setattr不遵守属性命名约定_Python 3.x_Attributes_Naming Conventions_Setattr - Fatal编程技术网

Python 3.x setattr不遵守属性命名约定

Python 3.x setattr不遵守属性命名约定,python-3.x,attributes,naming-conventions,setattr,Python 3.x,Attributes,Naming Conventions,Setattr,前几天我遇到了一个奇怪的遭遇,下面的代码: class Obj: pass obj = Obj() setattr(obj, '@#^&%$&', None) 实际上起了作用。如果以下情况引发syntaxerror,为什么允许这种行为 obj.@#&%$&所有的setattr函数所做的就是将给定键处的给定值分配给对象的\uuu dict\uuuu字典。它不会对键进行任何验证,因此您可以使用getattr检索值,如下所示: getattr(obj, '@#^&%$

前几天我遇到了一个奇怪的遭遇,下面的代码:

class Obj:
    pass
obj = Obj()
setattr(obj, '@#^&%$&', None)
实际上起了作用。如果以下情况引发syntaxerror,为什么允许这种行为
obj.@#&%$&
所有的
setattr
函数所做的就是将给定键处的给定值分配给对象的
\uuu dict\uuuu
字典。它不会对键进行任何验证,因此您可以使用
getattr
检索值,如下所示:

getattr(obj, '@#^&%$&')
返回指定给所述键的值:

None

但是,点表示法后面的属性名不是带引号的字符串的一部分,因此必须遵循Python命名语法,否则解释器无法正确解析它。

它可以工作,因为它大致相当于写入:
obj.\uu dict\['@#^&%$&']=None
。但这并不正确;)