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_a和self.y_b不可用于类,RectPoint但可用于CircPoint?我将如何使它们可用?
此外,为什么self.x和self.y可用于两个类RectPoint和CircPoint?
进一步阅读的链接也将不胜感激(代替解释)
你的RectPoint.__init__方法掩盖了Point.__init__方法。因为Point.__init__不为RectPoint实例执行,所以永远不会设置self.x_a和self.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_a和self.y_b属性,之后它将返回并且该RectPoint.__init__方法将设置更多属性。
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |