覆盖Python 2中子类中__init__方法的一部分

时间:2017-08-07 14:10:26

标签: python class subclass

我想创建一个子类的子类(Barrier是一种类型的墙,这是一种障碍),我希望屏障具有相同的 init < / strong>方法作为墙,除了self.type =&#39;屏障&#39;,但我不知道如何做到这一点(我对编程很新,所以我&#39对不起,如果这很简单,但我还没有找到我理解的答案。到目前为止,我有:

map

如何更改它以使类Barrier具有与Wall相同的 init 方法的内容,除了他们的&#34; self.type =&#39;屏障&#39;&# 34;

2 个答案:

答案 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