我一直在学习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
功能没有打印出来?
这里只是要求澄清相关类之间的类继承和函数行为。
答案 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。