class Animal(object):
def __init__(self, nlegs=4):
print '__init__ Animal'
self.nlegs = nlegs
class Cat(Animal):
def __init__(self, talk='meow'):
print '__init__ Cat'
self.talk = talk
class Dog(Animal):
def __init__(self, talk='woof'):
print '__init__ Dog'
self.talk = talk
tom = Cat()
没有nlegs属性? Animal.__init__()
明确调用Cat.__init__
,或者我们应该使用super
做更多花哨的事情? Cat.__init__
界面添加其他参数?答案 0 :(得分:10)
要建立在其他人所说的基础之上,是的,您需要调用父级的__init__
方法。
通常最好使用super。但是,在某些情况下(特别是当你从多个类继承时)它可能是一个很大的问题。我会避免详细说明,various articles which discuss it不缺。 (此外,其他一些“特殊”功能也存在一些奇怪之处。例如,您可以执行super(SomeCls, self).__getitem__(5)
但super(SomeCls, self)[5]
无效。)
作为一个简单的例子,为什么使用它是一个好主意,你可以让Dog
和Cat
继承自Mammal
(继承自Animal
)而不是必须更改代码中除{class 1}}和Dog
继承的代码之外的其他位置。
至于您的Cat
实例没有tom
的原因,那是因为您没有调用tom.nlegs
的{{1}}方法。
还要记住,并非所有内容都需要在初始化时设置。对于此示例,更有意义的是不在Animal
方法中设置__init__
之类的内容。相反,只需在类中直接设置它。 E.g。
nlegs
基本上,如果某些内容可能会在实例之间发生变化(例如猫的颜色)或需要在初始化时完成(例如打开文件),那么它可能应该在__init__
中设置。
否则,如果我们希望对于类的任何实例都相同,则可以更直接地在类定义中设置它。
此外,以这种方式设置的属性将可用于文档工具(例如内置的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
函数),而初始化时设置的属性不会。
答案 1 :(得分:2)
使用super
:
class Cat(Animal):
def __init__(self, talk='meow', num_legs=4):
print 'Hay cat'
self.talk = talk
super(Cat, self).__init__(num_legs)
tom = Cat() #tom is a normal cat
bob = Cat('Nyan', 3) #bob is a japanese defective cat
答案 2 :(得分:1)
您需要查看有关super()
的Python文档。例如,您通常会通过调用Cat.__init__()
开始(或结束)super(Cat, self).__init__(<any args>)
方法。