不是类变量的 Python 私有类变量



当尝试从一个类访问__variables时,解析器假设两个下划线相对于当前类是私有的。请注意,一个不相关的函数是如何获得一个"私有"变量的。

这是一个bug吗?

<>之前>>> def (): pass…>>> A类:…def g(自我):…F.__x = 1…def h ():…通过…解析:选b…返回h…>>> z = A().g()>>> dir (z)[' _A__y’,‘__call__’,‘__class__进行’,‘__delattr__’,‘__dict__’,‘__doc__’,‘__get__"、"__getattribute__"、"__hash__"、"__init__"、"__module__"、"__name__"、"__new__"、"__reduce__"、"__reduce_ex__"、"__repr__"、"__setattr__"、"__str__"、"func_Closure ', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',' func_name ']>>> dir (f)[' _A__x’,‘__call__’,‘__class__进行’,‘__delattr__’,‘__dict__’,‘__doc__’,‘__get__"、"__getattribute__"、"__hash__"、"__init__"、"__module__"、"__name__"、"__new__"、"__reduce__"、"__reduce_ex__"、"__repr__"、"__setattr__"、"__str__"、"func_Closure ', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',' func_name ']之前

这是一个有充分记录的行为。

只要发生在类的定义中,这种混淆就不会考虑标识符的语法位置。

这里有一种声明私有变量的方法:重载__setattr__(以及其他许多关于属性的方法)方法,在方法中,您可以检查当前执行的方法是否在自己的类中。如果是真的,就让它过去吧。否则,您可以引发异常,或者您可以使用自己的自定义错误句柄逻辑。(提示:使用inspect.stack函数)

最新更新