class People: def __init__(self,name): self.name = name def say(self): print("我是人,名字为:",self.name) class Animal: def __init__(self,food): self.food = food def display(self): print("我是动物,我吃",self.food) #People中的 name 属性和 say() 会遮蔽 Animal 类中的 class Person(People, Animal): pass per = Person("zhangsan") per.say() #per.display()运行结果,结果为:
我是人,名字为: zhangsan
上面程序中,Person 类同时继承 People 和 Animal,其中 People 在前。这意味着,在创建 per 对象时,其将会调用从 People 继承来的构造函数。因此我们看到,上面程序在创建 per 对象的同时,还要给 name 属性进行赋值。
Traceback (most recent call last):
File "D:\python3.6\Demo.py", line 18, in <module>
per.display()
File "D:\python3.6\Demo.py", line 11, in display
print("我是动物,我吃",self.food)
AttributeError: 'Person' object has no attribute 'food'
class Person(Animal, People)
则在创建 per 对象时,会给 food 属性传值。这意味着,per.display() 能顺序执行,但 per.say() 将会报错。super(Class, obj).__init__(...)
其中,Class 值得是子类的类名,obj 通常指的就是 self。super().__init__(...)
class People: def __init__(self,name): self.name = name def say(self): print("我是人,名字为:",self.name) class Animal: def __init__(self,food): self.food = food def display(self): print("我是动物,我吃",self.food) class Person(People, Animal): #自定义构造方法 def __init__(self,name,food): #调用 People 类的构造方法 super().__init__(name) #super(Person,self).__init__(name) #执行效果和上一行相同 #People.__init__(self,name)#使用未绑定方法调用 People 类构造方法 #调用其它父类的构造方法,需手动给 self 传值 Animal.__init__(self,food) per = Person("zhangsan","熟食") per.say() per.display()运行结果为:
我是人,名字为: zhangsan
我是动物,我吃 熟食
本文链接:http://task.lmcjl.com/news/9701.html