我一直在学习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
s放得到处都是,我可以看到print
能够调用它的父类Dog
(对吗?)我的另一个问题是,当我使用
howl
时,它为什么要使用Animal
函数调用?当一个rover = Dog("Rover")
函数真正的作用是将一个值设置为一个变量(__init__
)时,它的目的是什么?因为没有人调用__init__
,而且您不能执行self.name
,为什么rover.__init__("Rover")
类的print(rover = Dog("Rover"))
函数没有打印出来?这里只需要澄清类继承和相关类之间的函数行为。
最佳答案
你的帖子包含多个问题,所以我们开始吧!
1Dog
能够从其父类调用函数howl
(对吗?)
是的,你是对的。
因为您声明您的Animal
类是从Dog
-Animal
继承的,class Dog(Animal)
类将具有在Dog
中声明的所有属性(包括方法),因此您可以在dog上调用Animal
。
2当我使用howl
时,为什么它使用rover = Dog("Rover")
函数调用?
当使用__init__
创建一个对象时,在场景后面发生的事情,特别是Python将调用在类ClassName(<parameters>)
中定义的__init__
方法。有关更多详细信息,请参见the ClassName
documentation,它还指示了为什么没有__init__
方法的类将调用其父类的__init__
方法。本文档还回答了您的子问题__init__
函数的目的是什么。。。?.
总的来说,您(几乎)永远不会直接调用__init__
方法。
有趣的是!
3为什么类的__init__
函数没有打印出来?
在您的代码示例中,__init__
和Animal
的__init__
方法几乎相似,即设置Animal
属性并打印一些内容。唯一的区别是它们打印的内容。所以让我们想象一下你这样重写你的课程:
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!
正如command所解释的,当我们调用
Dog
-参见documentation-它将检索name
的超类,然后调用super(Dog, self).__init__(name)
方法来初始化当前对象Dog
-因此设置__init__
并调用self
类中的name
语句。所有这些,你最终都会接到正确的电话
print
!请注意,有几种方法可以调用超级类的
Animal
: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 - 通过学习Python方式了解Python中的类继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29090369/