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

Posted

技术标签:

【中文标题】不是类变量的 Python 私有类变量【英文标题】:Python private class variables that aren't class variables 【发布时间】:2011-10-21 11:28:15 【问题描述】:

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

这是一个错误吗?

>>> def f(): 通过 ... >>> A类: ...定义克(自我): ... f.__x = 1 ... 定义 h(): ... 经过 ... h.__y = 2 ...返回 h ... >>> z = A().g() >>> 目录(z) ['_A__y','__call__','__class__','__delattr__','__dict__','__doc__','__get_ _','__getattribute__','__hash__','__init__','__module__','__name__','__new __','__reduce__','__reduce_ex__','__repr__','__setattr__','__str__','func_ 闭包','func_code','func_defaults','func_dict','func_doc','func_globals', 'func_name'] >>> 目录(f) ['_A__x','__call__','__class__','__delattr__','__dict__','__doc__','__get_ _','__getattribute__','__hash__','__init__','__module__','__name__','__new __','__reduce__','__reduce_ex__','__repr__','__setattr__','__str__','func_ 闭包','func_code','func_defaults','func_dict','func_doc','func_globals', 'func_name']

在 python 2.5 和 3.2 上测试

【问题讨论】:

按预期工作。诚然,您对它们所做的事情是不寻常的,但这些属性属于该类,无论它们碰巧在哪里。 【参考方案1】:

这是well documented behavior。

只要它出现在类的定义中,就不会考虑标识符的语法位置。

【讨论】:

问题是,如果您从类定义之外的任何地方定义 f.__x ,它就可以正常工作。所以“f”没有任何隐私(正如其他一些已经删除的答案所说的那样),只是在一个类中你不能访问这些类型的变量(忽略 getattr/setattr)。 对不起,访问什么样的变量?以__ 开头的变量?我会说在类定义之外为f.__x 赋值是错误的。单个下划线足以将变量标记为“私有”;名称修改的目的不是真正的隐私,而是在类继承的上下文中避免冲突。 根据这些事实,是的,我同意在类之外使用双下划线是错误的。这对我来说只是一个令人惊讶的结论。【参考方案2】:

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

【讨论】:

以上是关于不是类变量的 Python 私有类变量的主要内容,如果未能解决你的问题,请参考以下文章

Python - 从私有静态方法设置类变量

在 Python 中访问类的**私有**变量

python 面向对象

Python基础 类私有成员和保护成员

OC中私有方法和私有变量

从 C++ 中的类访问私有变量