我想创建一个子类的子类(Barrier是一种类型的墙,这是一种障碍),我希望屏障具有相同的 init < / strong>方法作为墙,除了self.type =&#39;屏障&#39;,但我不知道如何做到这一点(我对编程很新,所以我&#39对不起,如果这很简单,但我还没有找到我理解的答案。到目前为止,我有:
map
如何更改它以使类Barrier具有与Wall相同的 init 方法的内容,除了他们的&#34; self.type =&#39;屏障&#39;&# 34;
答案 0 :(得分:4)
在调用Wall
版本后,只需覆盖一个属性:
class Barrier(Wall):
def __init__(self, origin, end):
super().__init__(origin, end)
self.type = 'barrier'
def __str__(self):
return "Barrier obstacle"
但是,您可能需要考虑使用类属性;您的实例属性都不是动态的,并且特定于每个类的实例。每个类的type
属性肯定不会从一个实例变为另一个实例:
class Obstacle:
type = 'obstacle'
def __str__(self):
return self.type
class Wall(Obstacle):
type = 'wall'
def __init__(self, origin, end):
super().__init__()
self.origin = origin
self.end = end
# etc.... (i.e. there are more things included in here which the
# that the barrier also needs to have (like coordinate vectors etc.)
class Barrier(Wall):
type = 'barrier'
答案 1 :(得分:2)
由于&#34;类型&#34;似乎依赖于课程,我不会将type
属性放在对象中,而是类级别:
class Obstacle:
type = 'obstacle'
def __init__(self):
# do something
pass
def __str__(self):
return "obstacle"
class Wall(Obstacle):
type = 'wall'
def __init__(self, origin, end):
super().__init__()
self.origin = origin
self.end = end
class Barrier(Wall):
type = 'barrier'
def __str__(self):
return "Barrier obstacle"
此外,如果覆盖它,最好调用super().__init__
方法。因为否则不会在类层次结构中更高的初始化(这有时是期望的行为,但通常不是)。
这样做的好处是 - 至少在我看来 - 更优雅。从这里可以清楚地看出,每个类都定义了type
。但此外,它将减少使用的内存量。由于我们每个类存储一个属性,因此每个对象不一个。
但是,如果您想要更改单个对象的属性,那么仍然可以。例如:
>>> obs1 = Obstacle()
>>> weird_obs = Obstacle()
>>> weird_obs.type = 'weird obstacle'
>>> obs2 = Obstacle()
>>> obs1.type
'obstacle'
>>> weird_obs.type
'weird obstacle'
>>> obs2.type
'obstacle'
因此,我们仍然可以灵活地将特定类型添加到特定对象。但默认情况下,如果我们查询障碍type
,它将执行回退并返回在类级别定义的type
。