为子类和父类中的属性赋值之间的差异



选择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)

两个选项都返回相同的结果,但有人能解释一下给子类(Human)和父类(Mammal)指定名称之间的区别吗?在这两个选择之间有更好的选择吗?

非常感谢!

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

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

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

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

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

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

相反的情况可能是,如果你决定大多数哺乳动物都没有名字。显然,在这种情况下,您只想在Human __init__中定义名称。

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

在第二个示例中,在Human类中,使用Mammal中的self.name

最新更新