在Python中模拟私有变量

5 投票
2 回答
5217 浏览
提问于 2025-04-16 01:35

可能重复的问题:
Python中的私有成员

我有一些变量是我想要隐藏的,因为它们不应该被外部访问。而且,所有这些没有文档说明的变量会让继承变得没什么用。

我该如何隐藏这些不想让外部看到的变量呢?

为了说明我为什么需要私有变量,先举个例子,说明不能隐藏变量只是个小麻烦,然后再举个真的会出问题的例子:

class MyObject(object):
    def __init__(self, length):
        self.length = length
    def __len__(self):
        return length

item = MyObject(5)
item.length
len(item)

在这里,我有两种方法可以访问这个项目的“长度”。这只是个小麻烦,并没有什么严重的问题。

from wares import ImplementationSpecific

class MyThing(object):
    def __init__(self):
        self.__no_access_even_if_useful = ImplementationSpecific()
    def restricted_access(self):
        return self.__no_access_even_if_useful.mutable_value

thing = MyThing()
thing.restricted_access()
thing._MyThing__no_access_even_if_useful.something_useful_for_someone()

假设有一天我想改变实现方式……如果我没有把实现的细节隐藏好,可能会导致一些东西坏掉。

我认为任何人都可以编程。这个“任何人”可以从我的实现细节中找到有用的东西并加以利用,即使我已经强烈不建议这样做!要是能简单地说:“不,这里没有,试试别的。”那就轻松多了。

2 个回答

11

来自Python文档

在Python中,没有“私有”的实例变量,也就是说,不能仅通过对象内部访问的变量并不存在。不过,大多数Python代码遵循一个约定:如果一个名字前面有一个下划线(比如 _spam),那么它应该被视为不公开的部分(无论是函数、方法还是数据成员)。这意味着它是实现细节,可能会在没有通知的情况下发生变化。

15

在Python的文档中提到了私有变量:

9.6. 私有变量

在Python中,并没有真正的“私有”实例变量,也就是说,不能只在对象内部访问的变量并不存在。不过,大多数Python代码遵循一个约定:如果一个名字前面有一个下划线(比如 _spam),那么它应该被视为不公开的部分(无论是函数、方法还是数据成员)。这意味着它是实现的细节,可能会随时改变。

总结:在名字前加一个下划线。

撰写回答