我把继承和超级混为一谈。我在这里写了一些代码,请看下面
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
从上述输出中,我观察到了从子类(即Dog)调用的方法
为什么setName
不在没有注释的情况下从超类调用Dog类中的代码?你知道吗
以及
请解释上面的代码?你知道吗
我认为你对
super()
做什么和不做什么感到困惑。你知道吗如果省略对
super()
的调用,super()
将不会自动调用基类的继承方法。必须显式地使用它。这是Python的方式。你知道吗例1
当使用实际对象中不存在的成员对象时,Python会沿着继承阶梯查找匹配的成员。如果有人发现了,它将根据执行的操作返回/执行它。如果在任何一个父母身上也找不到它,它就会出错。你知道吗
例2
如果父对象和子对象中有同名的方法,并且使用子对象调用该方法,则将首先搜索子对象,如果找到匹配项,则将根据执行的操作返回/执行该方法。基本上,子对象中的方法与父对象中的方法相比较。你知道吗
在示例#1中,您不是覆盖
getName
和setName
的默认(Animal
)实现。你知道吗set
将名称命名为“fida”,然后get
名称(存储在self.__name
)和print
名称。你知道吗在示例#2中,您正在用
Dog
类中的实现重写getName
和setName
的默认实现。你知道吗setName()
现在将名称设置为“hereisfida”(您将self.name
设置为"here is"+name
),然后get
名称(存储在self.name
)和print
它。你知道吗重写一个类的成员函数只会这样做:重写(replace)这个函数;它不会神奇地调用所有父类。你知道吗
相关问题 更多 >
编程相关推荐