Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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 为什么uuu setattr_uuuu的“name”参数包含类,而uuu getattr_uuuuuu不包含类?_Python_Setattr_Getattr - Fatal编程技术网

Python 为什么uuu setattr_uuuu的“name”参数包含类,而uuu getattr_uuuuuu不包含类?

Python 为什么uuu setattr_uuuu的“name”参数包含类,而uuu getattr_uuuuuu不包含类?,python,setattr,getattr,Python,Setattr,Getattr,以下代码: class MyClass(): def test(self): self.__x = 0 def __setattr__(self, name, value): print name def __getattr__(self, name): print name raise AttributeError(name) x = MyClass() x.test() x.__y 产出: _My

以下代码:

class MyClass():
    def test(self):
        self.__x = 0

    def __setattr__(self, name, value):
        print name

    def __getattr__(self, name):
        print name
        raise AttributeError(name)

x = MyClass()
x.test()
x.__y
产出:

_MyClass__x
__y
Traceback (most recent call last):
...
AttributeError: __y
说明名称就是属性的名称的文档是完全没有帮助的,但是由于某种原因,它会根据您是设置它还是获取它而有所不同

我想知道的是:

我在这里犯了什么根本性的错误吗? 如何在第一种情况下得到x而不是MyClass_uux?
双下划线调用名称混乱。如果您不需要名称损坏,请不要使用双十一分

9.6. 私有变量 Python中不存在只能从对象内部访问的“Private”实例变量。但是,大多数Python代码都遵循一种约定:无论是函数、方法还是数据成员,以下划线作为前缀的名称(例如“垃圾邮件”)都应被视为API的非公共部分。应将其视为实施细节,如有变更,恕不另行通知

由于类私有成员有一个有效的用例,即避免名称与子类定义的名称发生名称冲突,因此对这种称为名称混乱的机制的支持有限。格式为uuu spam的任何标识符至少有两个前导下划线,最多一个尾随下划线以文本形式替换为u classname uuuuu spam,其中classname是当前类名,前导下划线已去除。只要标识符出现在类的定义中,就可以在不考虑标识符的语法位置的情况下进行修改

请注意,撕碎规则的设计主要是为了避免事故;仍然可以访问或修改被视为私有的变量。这甚至可以在特殊情况下使用,例如在调试器中

注意,传递给Excel、EVAL或Excel文件的代码不认为调用类的类名称是当前类;这与global语句的效果类似,global语句的效果同样限于字节编译在一起的代码。同样的限制也适用于getattr、setattr和delattr,以及直接引用_dict__时


我不太清楚为什么会发生这种情况,但如果你使用x而不是x,它会像你所期望的那样工作。

它被称为名称损坏:的确如此。有趣的是,uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我现在已经改正了。仍然存在不对称性,但我认为你已经抓住了核心问题。