为了扩充其他人所说的内容,是的,你需要调用父类的
__init__
方法。
通常最好使用super。然而,在某些情况下(特别是当你从多个类继承时),它可能会出现大问题。我不会详细介绍,有很多
各种讨论它的文章。(此外,一些其他“特殊”函数也存在一些奇怪的地方。例如,你可以执行
super(SomeCls, self).__getitem__(5)
,但
super(SomeCls, self)[5]
将不起作用。)
作为一个简单的例子,说明为什么这是一个好习惯:你可以让Dog和Cat继承自Mammal(继承自Animal),而不必改变代码中的其他位置,只需改变Dog和Cat继承的类即可。
至于为什么你的tom实例没有
tom.nlegs
,那是因为你没有调用Animal的
__init__
方法。
另外请记住,并非所有东西都需要在初始化时设置。对于这个例子,不在
__init__
方法中设置类似
nlegs
这样的东西更加合理。相反,直接在类中设置即可,例如:
class Mammal(object):
nlimbs = 4
def __init__(self):
print "I'm a mammal!"
class Cat(Mammal):
def __init__(self, color="calico"):
self.color = color
super(Cat, self).__init__()
print "I have {0} legs I am {1}".format(self.nlimbs, self.color)
class FiveLeggedCat(Cat):
nlimbs = 5
如果某些东西在不同的实例中可能会发生变化(例如猫的颜色),或者需要在初始化时完成(例如打开文件),那么它很可能应该在__init__
中设置。
否则,如果我们希望该属性对于类的任何实例都是相同的,则直接在类定义中设置会更清晰。
此外,以这种方式设置的属性将可供文档工具(例如内置的help
函数)使用,而在初始化时设置的属性则不会。
__init__
构造函数中。否则,使__init__
函数更简单,并直接在类定义中设置它。希望能有所帮助! - Joe Kington