如何在python3中定义和访问私有和受保护的变量和函数?

时间:2016-08-29 17:02:22

标签: python-3.x

我在访问python3中的私有变量时很困惑,因为如果从错误的方式访问它,它会生成新的变量。我在一个类中创建了一个私有变量_data(单下划线。对吧?),我想在子类中访问它。

class A_parent:
      _myVar=0


class B_child:
      _myVar=_myVar+1    #Right or wrong?

private, protected modifierpython3的约定是什么?

1 个答案:

答案 0 :(得分:0)

简单下划线只是阻止变量调用者/用户的惯例:您的示例将起作用(除了您可能想要定义实例变量,而不是类变量)

要使变量变为私有,您必须使用双下划线BUT:

class A_parent:
      __myVar=0


class B_child(A_parent):
      __myVar=__myVar+1    # __myVar or A and B are different: error because right term is not defined yet.

你在谈论“受保护的”变量。在这种情况下,建议像你一样使用简单的下划线。

实例变量的示例,更有用:

class A_parent:
    def __init__(self):
       self._myVar=0


class B_child(A_parent):
     def __init__(self):
      # call parent constructor else _myVar isn't defined
      A_parent.__init__(self)
      # syntax using super
      # super(B_child, self).__init__()

      self._myVar+=1    # Okay

如果你真的想要访问私有父属性,你可以这样做:

class A_parent:
    def __init__(self):
       self.__myVar=12


class B_child(A_parent):
     def __init__(self):
      # call parent constructor
      A_parent.__init__(self)
      print(self._A_parent__myVar)  # will print 12 when class is instantiated

但当然这是不明智的。只有当你不能重构母班时才使用。我从来没有这样做过。

请注意,如果省略对父构造函数的调用,则不会定义self._A_parent__myVar (Python是一种动态语言:您可以动态定义成员。在C ++或Java中,不调用构造函数仍然会定义父成员变量,但不在此处定义)