类、隐藏属性和继承

Asi*_* M. 0 python inheritance attributes class python-2.7

我对 OOP 和 Python 很陌生。我所知道的几乎所有内容都是自学的,因此如果您能提供一些链接供我阅读,我将不胜感激,因为我不知道为了澄清我的疑问而应该寻求的确切术语。

到目前为止,这是我的代码:

class Point(object):
    x = 2
    y = 3

    def __init__(self, x, y):
        self.x_a = x
        self.y_b = y

class RectPoint(Point):

    def __init__(self, x, y):
        self.x_1 = x
        self.y_1 = y
        self.dist = (x*x + y*y)**0.5


class CircPoint(Point):
    pass

a = Point(3,4)
b = CircPoint(3,4)
c = RectPoint(3,4)

print a.x     # 2
print a.y     # 3
print a.x_a   # 3
print a.y_b   # 4
print b.x     # 2
print b.y     # 3
print b.x_a   # 3
print b.y_b   # 4
print c.x     # 2
print c.y     # 3
print c.x_1   # 3
print c.y_1   # 4
print c.dist  # 5.0
print c.x_a   # AttributeError
print c.y_b   # AttributeError
Run Code Online (Sandbox Code Playgroud)

为什么属性self.x_aself.y_b不可用于类,RectPoint但可用于CircPoint?我将如何使它们可用?

此外,为什么self.xself.y可用于两个类RectPointCircPoint

进一步阅读的链接也将不胜感激(代替解释)

Mar*_*ers 5

你的RectPoint.__init__方法掩盖Point.__init__方法。因为Point.__init__不为RectPoint实例执行,所以永远不会设置self.x_aself.y_b属性。这是因为 Python 首先搜索实例,然后是类,然后是属性的基类。在这里,方法确实是专门的属性。创建类的实例时,Python__init__在类上查找方法,然后在基类上查找。

CircPoint没有实现它们自己的__init__所以Point.__init__被发现和使用,self.x_a并且self.y_b 设置。

你为and做特定的属性;Python 以相同的搜索顺序找到这些;它们没有在实例上设置,最终会在基类上找到;要么是因为您有一个实例或子类,并且搜索了该子类的基类。xyPointPointPoint

您可以从以下位置显式调用重写的__init__方法RectPoint.__init__

class RectPoint(Point):
    def __init__(self, x, y):
        super(RectPoint, self).__init__(x, y)
        self.x_1 = x
        self.y_1 = y
        self.dist = (x*x + y*y)**0.5
Run Code Online (Sandbox Code Playgroud)

super()函数使您可以访问Point.__init__此处的原始方法,首先调用它。该方法然后设置self.x_aself.y_b属性,之后它将返回并且该RectPoint.__init__方法将设置更多属性。

Python 教程Class一章详细介绍了所有这些内容。