我对继承和超级感到困惑。在这里我写了一些代码,请看下面,
class Animal(object):
"""docstring for Animal"""
__name, __weight, __sound = ["",0,1]
def __init__(self):
super(Animal, self).__init__()
def setName(self, newName):
self.__name = newName
def getName(self):
return self.__name
class Dog(Animal):
"""docstring for Dog"""
def __init__(self):
super(Dog, self).__init__()
def setName(self, name):
self.name = "here is "+ name
def getName(self):
return self.name
if __name__ == "__main__":
fida = Dog()
fida.setName('fida')
def changeObjectName(obj):
obj.setName("Marcus")
print fida.getName()
changeObjectName(fida)
print fida.getName()
这里我观察两个案例输出,
class Dog(Animal):
"""docstring for Dog"""
def __init__(self):
super(Dog, self).__init__()
# def setName(self, name):
# self.name = "here is "+ name
# def getName(self):
# return self.name
我得到了这样的输出:
fida
Marcus
从上面的输出中我观察了从超类调用的方法(即动物)
class Dog(Animal):
"""docstring for Dog"""
def __init__(self):
super(Dog, self).__init__()
def setName(self, name):
self.name = "here is "+ name
def getName(self):
return self.name
我得到了这样的输出,
here is fida
here is Marcus
从上面的输出我观察到从子类调用的方法(即;狗)
为什么setName
没有在超类中调用Dog类中的代码?
和
请解释上面的代码?
答案 0 :(得分:1)
示例1
当您使用实际对象中不存在的成员对象时,Python会继承继承阶梯并查找匹配的成员。如果发现它将根据执行的操作返回/执行它。如果在任何父母中也找不到它,它将失败并出现错误。
示例2
如果在父项和子项中都有一个具有相同名称的方法,并且如果使用子对象调用该方法,则将首先搜索子对象,如果找到匹配项,则它将返回/执行它,具体取决于操作执行。基本上,子对象中的方法会遮蔽父对象中的方法。
答案 1 :(得分:0)
在示例#1中,您不覆盖Animal
和getName
的默认(setName
)实现。
set
将名称改为“fida”,然后get
名称(存储在self.__name
中)和print
名称。getName
和setName
的默认实现与Dog
类中的实现重叠。
setName()
现在将名称设置为“here is fida”(您将self.name
设置为"here is"+name
),然后将get
设置为名称(存储在self.name
)和print
它。覆盖类的成员函数就是这样做:覆盖(替换)函数;它不会神奇地调用所有父类。
答案 2 :(得分:0)
我认为你对super()
做什么和不做什么感到困惑。
super()
的调用, super()
将不会自动调用基类的继承方法。必须使用明确。 Tis是Python的方式。