python - 通过学习Pythonthehardway了解Python中的类继承

标签 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")) ,为什么没有Animal类的__init__函数打印出来?

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

最佳答案

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

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__方法将调用其父级的 __init__方法。本文档还回答了您的子问题__init__ 的目的是什么?功能...?。 总体思路是,您(几乎)永远不会调用 __init__直接方法。

现在是有趣的部分!

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

在您的代码示例中 __init__方法AnimalDog几乎相似,即设置 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!

正如推荐所解释的,导入行是当我们调用 super(Dog, self).__init__(name) 时- 参见documentation - 它将检索 Dog 的父类(super class)然后我们调用__init__初始化当前对象的方法self - 因此设置name并调用 print Animal 中的声明类(class)。

完成所有这些后,您最终会正确调用 print !

请注意,您有多种方法可以调用父类(super class)的 __init__ :

Animal.__init__(self, name)
super(Dog, self).__init__(name)
super(self.__class__, self).__init__(name) # self.__class__ is the class of self or its type.

参见this question更深入地比较各种语法。

关于python - 通过学习Pythonthehardway了解Python中的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29090369/

相关文章:

python - Windows 机器上使用 Python 2.7 和 3.4 的 Pip

python - Flask 上下文处理器函数

java - 创建自定义覆盖方法问题

Swift不支持多重继承,如何实现?

python - 如何使用其唯一的 ID 将项目添加到 Qcombobox

确定当前元素是生成器的第一个元素还是最后一个元素的 Pythonic 方法?

python - 在 Python 上计算三分之一

java - java中的最终字段继承

python - 在 Python Pandas 的列中为每个 na 填充唯一值

python - 有没有更好的方法来使用 Tornado 处理 index.html?