阿坝县建设局网站,logo设计及创意说明,仿做静态网站多少钱,泉州企业网站开发Python 中子类会继承父类所有的类属性和类方法。严格来说#xff0c;类的构造方法其实就是实例方法#xff0c;因此毫无疑问#xff0c;父类的构造方法#xff0c;子类同样会继承。
但我们知道#xff0c;Python 是一门支持多继承的面向对象编程语言#xff0c;如果子类…Python 中子类会继承父类所有的类属性和类方法。严格来说类的构造方法其实就是实例方法因此毫无疑问父类的构造方法子类同样会继承。
但我们知道Python 是一门支持多继承的面向对象编程语言如果子类继承的多个父类中包含同名的类实例方法则子类对象在调用该方法时会优先选择排在最前面的父类中的实例方法。显然构造方法也是如此。
举个例子
class People:def __init__(self,name):self.name namedef say(self):print(我是人名字为,self.name)
class Animal:def __init__(self,food):self.food fooddef 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 属性进行赋值。
但如果去掉最后一行的注释运行此行代码Python 解释器会报如下错误
Traceback (most recent call last):File D:\python3.6\Demo.py, line 18, in moduleper.display()File D:\python3.6\Demo.py, line 11, in displayprint(我是动物,我吃,self.food)
AttributeError: Person object has no attribute food
这是因为从 Animal 类中继承的 display() 方法中需要用到 food 属性的值但由于 People 类的构造方法“遮蔽”了Animal 类的构造方法使得在创建 per 对象时Animal 类的构造方法未得到执行所以程序出错。
反过来也是如此如果将第 13 行代码改为如下形式
class Person(Animal, People)
则在创建 per 对象时会给 food 属性传值。这意味着per.display() 能顺序执行但 per.say() 将会报错。
针对这种情况正确的做法是定义 Person 类自己的构造方法等同于重写第一个直接父类的构造方法。但需要注意如果在子类中定义构造方法则必须在该方法中调用父类的构造方法。
在子类中的构造方法中调用父类构造方法的方式有 2 种分别是
类可以看做一个独立空间在类的外部调用其中的实例方法可以向调用普通函数那样只不过需要额外备注类名此方式又称为未绑定方法使用 super() 函数。但如果涉及多继承该函数只能调用第一个直接父类的构造方法。也就是说涉及到多继承时在子类构造函数中调用第一个父类构造方法的方式有以上 2 种而调用其它父类构造方法的方式只能使用未绑定方法。 值得一提的是Python 2.x 中super() 函数的使用语法格式如下
super(Class, obj).__init__(...)
其中Class 值得是子类的类名obj 通常指的就是 self。
但在 Python 3.x 中super() 函数有一种更简单的语法格式推荐大家使用这种格式
super().__init__(...)
在掌握 super() 函数用法的基础上我们可以尝试修改上面的程序
class People:def __init__(self,name):self.name namedef say(self):print(我是人名字为,self.name)
class Animal:def __init__(self,food):self.food fooddef 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
我是动物,我吃 熟食
可以看到Person 类自定义的构造方法中调用 People 类构造方法可以使用 super() 函数也可以使用未绑定方法。但是调用 Animal 类的构造方法只能使用未绑定方法。
Python教程8天python从入门到精通学python看这套就够了