Skip to main content
 首页 » 编程设计

python之等效于 `const` 对 Python 中私有(private)类成员的引用

2025年05月04日17zhoujg

我知道在 Python 中没有私有(private)/ protected /公共(public)类成员的真正概念。然而,使用下划线可以在一定程度上实现这一点。例如,考虑一个对象,它应该计算流中偶数的数量。以下将是一个相对安全的实现

class EvensCounter: 
    def __init__(self): 
        self._count = 0 
 
    def __call__(self, n): 
        if n % 2 == 0: 
            self._count += 1 
 
    @property  
    def count(self): 
        return self._count 

这样,用户就不会无意中更改 count,例如:

    counter = EvensCounter() 
    counter.count = 5          # Gives AttributeError: can't set attribute 

我曾经认为这相当于在 C++ 中将 count 定义为 private 成员变量,然后只有一个返回 const 引用的 getter 到私有(private)成员变量。

但是,我意识到上面的说法并不完全正确。假设 count 不是简单的 int,而是更复杂的 MyInt 类型,定义如下:

class MyInt: 
    def __init__(self): 
        self._value = 0 
 
    def inc(self, n=1): 
        self._value += n 
 
    @property 
    def value(self): 
        return self._value 
 
 class EvensCounter: 
    def __init__(self): 
        self._count = MyInt() 
 
    def __call__(self, n): 
        if n % 2 == 0: 
            self._count.inc() 
 
    @property  
    def count(self): 
        return self._count 

在这种情况下,下面的代码可以有效地修改 count 值:

    counter = EvensCounter() 
    counter.count.inc(5) 

虽然用户无法更改 _count 变量以引用另一个对象,但它仍然可以调用该对象的方法来更改其状态。 (而在 C++ 中,因为 inc() 方法不是 const 方法,所以不能在 const 引用上调用它。)

我想知道 Python 中是否有一种机制可以提供与 C++ 的 const 引用相同的安全保证?也就是说,我需要一种方法来公开对类的(私有(private))成员的引用,该成员只允许用户“读取”该成员变量,但不允许他更改该成员变量的状态。

请您参考如下方法:

不,没有这样的事情。 C++ 是唯一支持它的主要语言(“主要”,我的意思是“市场流行度前 10 名”,不想挑起争端)。 Python 显然没有 const 概念,但即使在有此概念的语言中,const 也会阻止您重新分配变量,但不会更改它所引用的对象。

因此,大多数语言的主要区别在于返回的对象是可变的还是不可变的,正如您的两个示例已经说明的那样。您无能为力,只能希望用户尊重您的 API。