从LearningPythonthehardway了解Python中的类继承

时间:2015-03-17 02:33:33

标签: python python-2.7 inheritance

我一直在学习Python,我终于明白了继承在类和对象之间的意义。所以这是我的代码,我想确保我正确地做到这一点:

class Animal(object):
    def __init__(self, name):
        self.name = name
        print self.name
    def howl(self, name):
        print "Eeh %s" % name


class Dog(Animal):
    def __init__(self, name):
        ##has-a __init__ function that takes self and name parameters.
        self.name = name
        print "%s barks and is happy" % self.name
    def sound(self, name):
        print "%s barks" % name


rover = Dog("Rover")

rover.sound("Rover")

rover.howl("Rover")

为了更好地理解我的类使用“基类”Animal的行为方式,我将print放在所有地方,我可以看到Dog能够从其父类howl调用Animal函数(是吗?)

我的另一个问题是,当我使用rover = Dog("Rover")时,它是如何使用__init__函数调用的?当__init__函数真正为函数设置值(self.name)时,它的目的是什么?因为没有人拨打rover.__init__("Rover"),您无法执行print(rover = Dog("Rover")),为什么__init__类的Animal功能没有打印出来?

这里只是要求澄清相关类之间的类继承和函数行为。

2 个答案:

答案 0 :(得分:2)

如果你构建一个类,你将需要init函数。 因为你覆盖了__init__函数,如果你没有在Dog中编写__init__函数,它将使用Animal的init函数。如果你想使用Animal的init函数,你可以这样做:

class Dog(Animal):
    def sound(self, name):
        print "%s barks" % name

答案 1 :(得分:2)

您的帖子包含多个问题,所以我们开始吧!

1 Dog能够从其父类howl调用Animal函数(是吗?)

是的,你是对的。 由于您宣布Dog类继承自Animal - class Dog(Animal) - Dog类将具有Animal中声明的所有属性(包括方法),因此您可以给狗打电话howl

2当我使用rover = Dog("Rover")时,它是如何使用__init__函数调用的?

使用ClassName(<parameters>)创建对象时,场景背后发生的事情是,Python将调用类__init__中定义的ClassName方法。有关详细信息,请参阅the __init__ documentation,其中还说明了没有__init__方法的班级会调用其父{h} __init__方法的原因。本文档还回答了您的子问题 __init__函数的目的是什么......?。 总的想法是你(几乎)从不直接调用__init__方法。

现在是有趣的部分!

3为什么__init__课程的Animal功能没有打印出来?

在您的代码示例中,__init__Animal的{​​{1}}方法几乎相似,即设置Dog属性并打印一些内容。唯一的区别是他们印刷的东西。所以,让我们想象你像这样重写你的课程:

name

正如推荐所解释的那样,导入行是在我们致电class Animal(object): def __init__(self, name): self.name = name print "I am an Animal named %s" % self.name class Dog(Animal): def __init__(self, name): super(Dog, self).__init__(name) # That's the important line print "I am actually a Dog named %s, I bark too!" % self.name rover = Dog("Rover") # Output: # I am an Animal named Rover # I am actually a Dog named Rover, I bark too! 时 - 请参阅documentation - 它会检索超级super(Dog, self).__init__(name),然后我们调用Dog方法初始化当前对象__init__ - 因此设置self并在name类中调用print语句。

通过这一切,您最终得到了对Animal的正确电话!

请注意,您有多种方法可以调用超类print

__init__

有关各种语法的更深入比较,请参阅this question