我在访问python3
中的私有变量时很困惑,因为如果从错误的方式访问它,它会生成新的变量。我在一个类中创建了一个私有变量_data
(单下划线。对吧?),我想在子类中访问它。
class A_parent:
_myVar=0
class B_child:
_myVar=_myVar+1 #Right or wrong?
private, protected modifier
中python3
的约定是什么?
答案 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中,不调用构造函数仍然会定义父成员变量,但不在此处定义)