Python继承输出
Python Inheritance Output
class ParentClass(object):
def __init__(self):
self.__x = 1
self.y = 10
def PRINT(self):
print (self.__x, self.y)
class ChildClass(ParentClass):
def __init__(self):
super(ChildClass, self).__init__()
self.__x = 2
self.y = 20
c = ChildClass()
c.PRINT()
为什么输出的是(1, 20)?我知道我是怎么得到 20 的,但它不应该是 2 而不是 1 吗?
以两个下划线开头的成员是“私人”。虽然 Python 没有真正的方法来限制对成员的访问,但它会进行一些名称修改,为他们提供更复杂的名称,以便他们或多或少保持私密性。
因此,在您的情况下,ParentClass
有一个 __x
字段用于 PRINT
方法。 ChildClass
有一个单独的、独立的 __x
字段,不在任何地方使用。所以对于打印,只使用父级的__x
。
要解决此问题,只需将两个下划线更改为一个下划线,将名称标记为“内部”但不是类型私有的。
对于 class 中的 'private' 变量(__
作为前缀),其名称已更改。您可以使用新名称相应地调用变量。像这样:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class ParentClass(object):
def __init__(self):
self.__x = 1
self.y = 10
def PRINT(self):
print (self.__x, self.y)
print (self._ParentClass__x, self.y)
print (self._ChildClass__x, self.y)
class ChildClass(ParentClass):
def __init__(self):
super(ChildClass, self).__init__()
self.__x = 2
self.y = 20
c = ChildClass()
c.PRINT()
输出:
(1, 20)
(1, 20)
(2, 20)
只是为了稍微扩展一下 poke 的回答...
来自the official Python tutorial
Any identifier of the form __spam (at least two leading underscores,
at most one trailing underscore) is textually replaced with
_classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard
to the syntactic position of the identifier, as long as it occurs
within the definition of a class.
因此,如果我们将这一行添加到您的代码末尾:
print c._ChildClass__x, c._ParentClass__x,
它将打印
(1, 20)
2 1
class ParentClass(object):
def __init__(self):
self.__x = 1
self.y = 10
def PRINT(self):
print (self.__x, self.y)
class ChildClass(ParentClass):
def __init__(self):
super(ChildClass, self).__init__()
self.__x = 2
self.y = 20
c = ChildClass()
c.PRINT()
为什么输出的是(1, 20)?我知道我是怎么得到 20 的,但它不应该是 2 而不是 1 吗?
以两个下划线开头的成员是“私人”。虽然 Python 没有真正的方法来限制对成员的访问,但它会进行一些名称修改,为他们提供更复杂的名称,以便他们或多或少保持私密性。
因此,在您的情况下,ParentClass
有一个 __x
字段用于 PRINT
方法。 ChildClass
有一个单独的、独立的 __x
字段,不在任何地方使用。所以对于打印,只使用父级的__x
。
要解决此问题,只需将两个下划线更改为一个下划线,将名称标记为“内部”但不是类型私有的。
对于 class 中的 'private' 变量(__
作为前缀),其名称已更改。您可以使用新名称相应地调用变量。像这样:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class ParentClass(object):
def __init__(self):
self.__x = 1
self.y = 10
def PRINT(self):
print (self.__x, self.y)
print (self._ParentClass__x, self.y)
print (self._ChildClass__x, self.y)
class ChildClass(ParentClass):
def __init__(self):
super(ChildClass, self).__init__()
self.__x = 2
self.y = 20
c = ChildClass()
c.PRINT()
输出:
(1, 20)
(1, 20)
(2, 20)
只是为了稍微扩展一下 poke 的回答...
来自the official Python tutorial
Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.
因此,如果我们将这一行添加到您的代码末尾:
print c._ChildClass__x, c._ParentClass__x,
它将打印
(1, 20)
2 1