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。我现在已经改正了。仍然存在不对称性,但我认为你已经抓住了核心问题。