简单的python继承

时间:2011-06-17 05:10:47

标签: python inheritance constructor

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
  1. 为什么我的猫tom = Cat()没有nlegs属性?
  2. 我们是否应该从Animal.__init__()明确调用Cat.__init__,或者我们应该使用super做更多花哨的事情?
  3. 如果我想创建一条有5条腿的猫,我是否需要在Cat.__init__界面添加其他参数?

3 个答案:

答案 0 :(得分:10)

要建立在其他人所说的基础之上,是的,您需要调用父级的__init__方法。

通常最好使用super。但是,在某些情况下(特别是当你从多个类继承时)它可能是一个很大的问题。我会避免详细说明,various articles which discuss it不缺。 (此外,其他一些“特殊”功能也存在一些奇怪之处。例如,您可以执行super(SomeCls, self).__getitem__(5)super(SomeCls, self)[5]无效。)

作为一个简单的例子,为什么使用它是一个好主意,你可以让DogCat继承自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>)方法。