如何在 Python 中使私有变量可访问? [复制]

Posted

技术标签:

【中文标题】如何在 Python 中使私有变量可访问? [复制]【英文标题】:How Do I Make Private Variables Inaccessable in Python? [duplicate] 【发布时间】:2015-03-24 04:39:11 【问题描述】:
class Car(object):
    def __init__(self, color, engine, oil):
        self.color = color
        self.__engine = engine
        self.__oil = oil

a = Car('black', 'a cool engine', 'some cool oil')

我们假设 __engine 和 __oil 变量是私有的,这意味着我不能通过像 a.__engine 这样的调用来访问它们。但是,我可以使用 __dict__ 变量来访问甚至更改这些变量。

# Accessing
a.__dict__
'_Car__engine': 'a cool engine', 'color': 'black', '_Car__oil': 'some cool oil'

# Changing
a.__dict__['_Car__engine'] = "yet another cool engine"
a.__dict__
'_Car__engine': 'yet another cool engine', 'color': 'black', '_Car__oil': 'some cool oil'

问题很简单。我希望只在类内部访问和更改私有变量。

【问题讨论】:

【参考方案1】:

您尝试做的事情在 Python 中是不可能的。

在 Python 中不存在只能从对象内部访问的“私有”实例变量。

https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

【讨论】:

从技术上讲,这不是真的。您可以伪造私有变量。这真的不值得。 @Marcin 我想不出任何方法可以使 Python 中的变量在技术上无法被外部代码访问,并且从未听说过这是可能的。如果你知道怎么做,请分享。 方法上的可变默认参数。您可以将该方法用作存储在此类默认参数中的该容器的修改器和访问器。无法访问底层数据结构。 @Marcin nope,你可以使用inspect.getargspec访问它(读取/修改) 对了,在C++和Java中可以分别使用指针和反射访问私有变量。【参考方案2】:

问题很简单。我希望只能在类内部访问和更改私有变量。

因此,不要在访问以__ 开头的变量的类之外编写代码。使用 pylint 或类似的东西来捕捉这样的样式错误。

【讨论】:

这并不是粗鲁的。但是,如果您只是为了自己的个人乐趣而编写代码,并且永远不必将其交给其他人来维护它,那么这个答案似乎会很好。任何时候您处于协作编码环境中(任何高等教育和/或工作经验),该代码都会被许多人使用。下线的人会想要使用一种简单的方法来更改您的 __you_really_should_not_touch_this 变量。他们这样做可能有充分的理由,但是您可能会设置您的代码,以便他们的“简单方法”会破坏事情。还有 - 黑帽子。 顺便说一句,您使用良好的编程实践是绝对正确的。我特别感谢您指出了一个特定的工具 - pylint @bballdave025 访问说明符不是安全功能。在专业环境中,您需要进行代码审查,团队可以决定他们何时真正想要触及私有内容。不使用一些混淆技术的好处是第三方用户不需要修改上游代码。

以上是关于如何在 Python 中使私有变量可访问? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在复制构造函数中访问私有变量?

Python私有类字段,如何制作? [复制]

如何在 python 3.5 中使对象可等待?

为啥我能够从在同一对象的另一个实例上调用的方法访问一个实例的私有实例变量? [复制]

如何在 Ruby 中将实例变量设为私有?

尽管类继承,变量仍不可访问? [复制]