0

选项A:

class Mammal(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return str(self.name)

class Human(Mammal):
    def __init__(self, name):
        self.name = name

me = Human("John")
print(me)

选项 B:

class Mammal(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return str(self.name)

class Human(Mammal):
    def __init__(self, name):
        super(Human, self).__init__(name)


me = Human("John")
print(me)

两种选择都返回相同的结果,但是有人可以解释将名称分配给子类(人类)和父类(哺乳动物)之间的区别吗?这两种选择之间有更好的选择吗?

非常感谢!

4

2 回答 2

2

这确实是一个类设计和维护的问题。显然,在这种情况下,人类没有哺乳动物和其他哺乳动物没有的特征。但是,例如,假设您稍后将 Mammal 更新为具有“feet”属性:

class Mammal(object):
    def __init__(self, name, feet):
        self.name = name
        self.feet = feet

哺乳动物现在有很多脚,所以你可能期望人类也有。但是me.feet会抛出一个错误,因为 Human__init__没有初始化它,Mammal__init__也没有运行。你也不能用 来声明英尺me = Human('Joe', 2),因为人类__init__不接受这个论点。所以你创造了一个维护问题——人类现在不是真正的好哺乳动物,因为它们的一些承诺属性总是未定义的。

使用 super 可以避免这个问题:

class Human(Mammal):
    def __init__(self, name):
        super(Human, self).__init__(name, 2)

当然,如果您想要很多海盗,这需要您将 Human 子类化,但这是另一个问题。

如果您认为大多数哺乳动物没有名字,则可能会出现相反的情况。显然,在这种情况下,您只想在 Human 中定义 name __init__

于 2013-08-09T00:46:07.473 回答
0

在第一个示例中,您只说 Human 继承自 Mammal(.__init__未调用 on Mammal),如果您尝试使用self.name,则会收到属性错误。

在第二个示例中,您在Human课堂上使用self.name来自 Mammal。

于 2013-08-09T01:04:09.630 回答