python是如何破坏对象名和类定义的?

python是如何破坏对象名和类定义的?,python,python-3.x,Python,Python 3.x,我试图理解python中的私有变量和名称混乱 当我这样定义类时,它抛出AttributeError 我想了解这个错误的确切原因。有人能解释清楚吗?我会让你参考 格式的任何标识符至少有两个前导下划线, 最多一个尾随下划线以文本形式替换为 _classname\uuu spam,其中classname是带前导下划线的当前类名 因此,这会引发AttributeError,因为_测试方法已被隐式重命名: class E: @staticmethod def __test():

我试图理解python中的私有变量和名称混乱

当我这样定义类时,它抛出AttributeError

我想了解这个错误的确切原因。有人能解释清楚吗?

我会让你参考

格式的任何标识符至少有两个前导下划线, 最多一个尾随下划线以文本形式替换为 _classname\uuu spam,其中classname是带前导下划线的当前类名

因此,这会引发AttributeError,因为_测试方法已被隐式重命名:

class E:
    @staticmethod
    def __test():
        print("foo")

E.__test() # AttributeError
但是可以通过使用损坏的名称_E_____测试使其工作:

请注意,由于您的方法不接受自参数,所以我不得不添加一个staticmethod装饰器。这超出了范围,但您可以阅读相关内容,并且。

我将向您介绍

格式的任何标识符至少有两个前导下划线, 最多一个尾随下划线以文本形式替换为 _classname\uuu spam,其中classname是带前导下划线的当前类名

因此,这会引发AttributeError,因为_测试方法已被隐式重命名:

class E:
    @staticmethod
    def __test():
        print("foo")

E.__test() # AttributeError
但是可以通过使用损坏的名称_E_____测试使其工作:


请注意,由于您的方法不接受自参数,所以我不得不添加一个staticmethod装饰器。这超出了范围,但您可以阅读相关内容。

这就像是将3个或4个不同的问题合并到一个问题中……您是否发现了非常类似的问题,如。。。我们能在这里补充什么以前没有说过的?@Aran Fey,对不起。因为这些都是相互联系的,用一个问题来提问。你能帮我清楚地理解它们吗?至于self和something:名称不重要,只要你知道第一个参数将是调用该方法的对象。必须有一个重复的参数来涵盖这一点。这就像3或4个不同的问题合并在一起…你有没有发现类似的问题,如。。。我们能在这里补充什么以前没有说过的?@Aran Fey,对不起。因为这些都是相互联系的,用一个问题来提问。你能帮我清楚地理解它们吗?至于self vs.something:名称并不重要,只要你理解第一个参数将是调用该方法的对象。必须有一个重复的参数来涵盖这一点。谢谢你的回答。将类定义为E和E有什么区别?请解释一下。@Pythoncoder一点也没有谢谢你的回答。将类定义为E和E有什么区别?请解释一下。@Pythoncoder一点也没有
class E:
    @staticmethod
    def __test():
        print("foo")

E._E__test() # prints 'foo'