在本教程中,我们将学习Python类中的私有变量。
Python没有称为私有变量的概念。但是,大多数Python开发人员都遵循命名约定来告诉变量不是公共变量,而是私有变量。
我们必须以双下划线开头一个变量名称,以将其表示为私有变量(不是真的)。示例:-一,二等..,。
正如我们已经说过的,名称以双下划线开头的变量不是私有的。我们仍然可以访问。让我们看看如何创建私有类型变量,然后看看如何访问它们。
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable')
我们已经创建了一个类及其实例。我们有两个变量,一个是正常变量,另一个是__init__方法内部的私有变量。现在,尝试访问变量。看看会发生什么。
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable') # accessing *nv* print(sample.nv) # accessing *__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变量。
我们有机会获得任何类变量,其名称startswith一个双下划线为_className \ _variableName_。因此,在示例中,它是_Sample \ _pv_。现在,使用_Sample \ _pv_名称访问它。
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable') # accessing *nv* print(sample.nv) # accessing *__pv** using _Sample__pv name print(sample._Sample__pv)
输出结果
如果运行上面的代码,则将得到以下结果。
Normal variable Private variable
为什么变量__名PV已经改变?
在Python中,有一个称为名称修饰的概念。Python会更改以双下划线开头的变量的名称。因此,任何名称以双下划线开头的类变量都将更改为_className \ _variableName_形式。
因此,该概念也将适用于该类的方法。您可以使用以下代码查看它。
class Sample: def __init__(self, a): self.a = a # private method(not really) def __get_a(self): return self.a # creating an instance of the class Sample sample = Sample(5) # invoking the method with correct name print(sample._Sample__get_a()) # invoking the method with wrong name 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'
使用双下划线的目的不是为了限制访问变量或方法。这是为了告诉特定变量或方法只应在类内部绑定。如果您对本教程有任何疑问,请在评论部分中提及。