我知道在 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。
