Python 程序中的私有变量

pythonserver side programmingprogramming更新于 2025/10/25 2:52:17

在本教程中,我们将学习 Python 类 中的 私有变量。

Python 没有 私有变量 这个概念。但是,大多数 Python 开发人员遵循命名约定来表示变量不是公共的,而是私有的。

我们必须以 双下划线 开头变量名来表示它是私有变量(实际上不是)。例如:- 一、二等..,。

正如我们已经说过的,名称以双下划线开头的变量不是私有的。 我们仍然可以访问。让我们看看如何创建私有类型变量,然后我们将看到如何访问它们。

# 创建一个类
class Sample:
   def __init__(self, nv, pv):
      # 普通变量
      self.nv = nv
      # 私有变量(不是真的)
      self.__pv = pv
# 创建类 Sample 的实例
sample = Sample('普通变量', '私有变量')

我们创建了一个类及其实例。我们有两个变量,一个是普通变量,另一个是 __init__ 方法内的私有变量。现在,尝试访问变量。看看会发生什么。

示例

# 创建类
类示例:
   def __init__(self, nv, pv):
      # 普通变量
      self.nv = nv
      # 私有变量(不是真的)
      self.__pv = pv
# 创建 Sample 类的实例
sample = Sample('Normal variable', 'Private variable')
# 访问 *nv*
print(sample.nv)
# 访问 *__pv**
print(sample.__pv)

输出

如果运行上述代码,则会得到以下输出。

Normal variable
---------------------------------------------------------------------------
AttributeError                         Traceback (most recent call last)
<ipython-input-13-bc324b2d20ef> in <module>
      14
      15 # accessing *__pv**
---> 16 print(sample.__pv)
AttributeError: 'Sample' object has no attribute '__pv'

程序显示 nv 变量时没有任何错误。但是当我们尝试访问 __pv 变量时,我们得到了 AttributeError。

为什么会得到这个错误?因为没有任何属性具有变量名称 __pv。那么 init 方法中的 self.__pv = pv 语句呢?我们稍后会讨论这个问题。首先,让我们看看如何访问 __pv 变量。

我们可以访问名称以双下划线开头的任何类变量,如 _className\_variableName_。因此,在示例中它是_Sample\_pv_。现在,使用 _Sample\_pv_ 名称访问它。

示例

# 创建一个类
class Sample:
   def __init__(self, nv, pv):
      # 普通变量
      self.nv = nv
      # 私有变量(不是真的)
      self.__pv = pv
# 创建 Sample 类的实例
sample = Sample('Normal variable', 'Private variable')
# 访问 *nv*
print(sample.nv)
# 使用 _Sample__pv 名称访问 *__pv**
print(sample._Sample__pv)

输出

如果您运行上述代码,那么您将获得以下结果。

普通变量
私有变量

为什么变量 __pv 的名称发生了变化?

在 Python 中,有一个概念叫做名称修改。Python 会更改以双下划线开头的变量的名称。因此,任何名称以双下划线开头的类变量都将更改为 _className\_variableName_ 形式。

因此,该概念也适用于类的方法。您可以通过以下代码看到它。

示例

class 示例:
   def __init__(self, a):
      self.a = a

   # private 方法(不是真的)
   def __get_a(self):
      return self.a
# 创建 Sample 类的实例
sample = Sample(5)
# 调用具有正确名称的方法
print(sample._Sample__get_a())
# 调用具有错误名称的方法
print(sample.__get_a())

输出

如果您运行上述代码,那么您将获得以下结果。

5
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-55650c4990c8> in <module>
      14
      15 # invoking the method with wrong name
---> 16 print(sample.__get_a())
AttributeError: 'Sample' object has no attribute '__get_a'

结论

使用双下划线的目的不是为了限制对变量或方法的访问。它是为了表明特定变量或方法只能在类内绑定。如果您对本教程有任何疑问,请在评论部分中提及。


相关文章


有用资源