Python 为子类和父类中的属性赋值之间的差异
选择A: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
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表示海盗!我找到了一本很好的读物: