不是类变量的 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 私有类变量的主要内容,如果未能解决你的问题,请参考以下文章