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

Python 为子类和父类中的属性赋值之间的差异,python,python-2.7,superclass,Python,Python 2.7,Superclass,选择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) class

选择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)
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)
选择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):
        self.name = name

me = Human("John")
print(me)
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)
两个选项都返回相同的结果,但是有人能解释一下将名称分配给子类(人类)和父类(哺乳动物)之间的区别吗?这两种选择之间有更好的选择吗


多谢各位

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

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

使用super可避免此问题:

class Human(Mammal):
    def __init__(self, name):
        super(Human, self).__init__(name, 2)
当然,如果你想要很多海盗的话,这就要求你对人类进行子类化,但这是另一个问题


相反的情况可能是,如果你认为大多数哺乳动物都没有名字。显然,在这种情况下,您可能只想在Human
\uuuuu init\uuuuu
中定义名称。在第一个示例中,您只说Human继承自哺乳类动物(哺乳类动物上的
\uuuuuu init\uuuuuu
),如果尝试使用
self.name
,您将得到一个属性错误


在第二个示例中,您在
人类
类中,使用哺乳动物的
self.name

Arg-Arg-Arg+1表示海盗!我找到了一本很好的读物: