Python 没有像 C++ 或 Java 那样的任何私有变量。如果需要,您也可以随时访问任何成员变量。但是,在 Python 中您不需要私有变量,因为在 Python 中公开您的类成员变量也不错。如果您需要封装一个成员变量,您可以稍后通过使用“@property”来做到这一点,而不会破坏现有的客户端代码。
在 python 中,单个下划线“_”用于表示方法或变量不被视为类的公共 api 的一部分,并且这部分 api 可以在不同版本之间更改。您可以使用这些方法/变量,但如果您使用此类的较新版本,您的代码可能会中断。
双下划线“__”并不意味着“私有变量”。您可以使用它来定义“类本地”的变量,并且不能轻易地被子类覆盖。它破坏了变量名称。
例如:
class A(object):
def __init__(self):
self.__foobar = None # will be automatically mangled to self._A__foobar
class B(A):
def __init__(self):
self.__foobar = 1 # will be automatically mangled to self._B__foobar
self.__foobar 的名称在 A 类中自动改写为 self._A__foobar。在 B 类中,它被改写为 self._B__foobar。因此,每个子类都可以定义自己的变量 __foobar 而无需覆盖其父变量。但是没有什么能阻止您访问以双下划线开头的变量。但是,名称修饰会阻止您偶然调用此变量/方法。
我强烈建议您观看来自 Pycon 2013 的 Raymond Hettinger 的Python 类开发工具包,它提供了一个很好的示例,为什么以及如何使用 @property 和“__”-instance 变量。
如果你已经暴露了公共变量并且你需要封装它们,那么你可以使用@property。因此,您可以从最简单的解决方案开始。您可以将成员变量公开,除非您有具体的理由不这样做。这是一个例子:
class Distance:
def __init__(self, meter):
self.meter = meter
d = Distance(1.0)
print(d.meter)
# prints 1.0
class Distance:
def __init__(self, meter):
# Customer request: Distances must be stored in millimeters.
# Public available internals must be changed.
# This would break client code in C++.
# This is why you never expose public variables in C++ or Java.
# However, this is python.
self.millimeter = meter * 1000
# In python we have @property to the rescue.
@property
def meter(self):
return self.millimeter *0.001
@meter.setter
def meter(self, value):
self.millimeter = meter * 1000
d = Distance(1.0)
print(d.meter)
# prints 1.0