python子类会继承父类所有的类属性和类方法。严格来说,类的构造方法其实就是实例方法,因此,父类的构造方法,子类同样会继承。

我们知道,python是一门支持多继承的面向对象编程语言,如果子类继承的多个父类中包含同名的类实例方法,则子类对象在调用该方法时,会优先选择排在最前面的父类中的实例方法。显然,构造方法也是如此。

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 xiaobai = Person("小白")
#Person类同时继承People和Animal,其中People在前。
#这意味着,在创建对象xiaobai时,其将会调用从People类继承来的构造函数,因此上面程序创建xiaobai对象的同时,还要给name属性进行赋值。
xiaobai.say()
xiaobai.display()
我是人,名字为: 小白
Traceback (most recent call last):
AttributeError: 'Person' object has no attribute 'food'
#从Animal类中继承的display()方法中,需要用到food属性的值,
#但由于People类的构造方法覆盖了Animal类的构造方法,使得在创建xiaobai对象时,Animal类的构造方法未得到执行,所以程序出错。

针对这种情况,正确的做法是定义Person类自己的构造方法(等同于重写第一个直接父类的构造方法),但是需要注意的是,在子类中定义构造方法,则必须在该方法中调用父类的构造方法。

  1. 未绑定方式
  2. 使用super()函数,但如果涉及多继承,该函数只能调用第一个直接父类的构造方法。
也就是说,涉及到多继承时,在子类构造函数中,调用第一个父类构造方法的方式有以上两种,而调用其他父类构造方法的方式只能使用未绑定方法。
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):
#调用第一个父类的构造方法
super().__init__(name)
#People.__init__(self, name)使用未绑定方法调用第一个父类的构造方法
#调用其他父类的构造方法,需要手动给self传值
Animal.__init__(self, food)
xiaobai = Person("xiaobai", "熟食")
xiaobai.say()
xiaobai.display()
我是人,名字为: xiaobai
我是动物,我吃 熟食

可以看到,Person类自定义的构造方法中,调用People类构造方法,可以使用super()函数,也可以使用未绑定方法。但是调用Animal类的构造方法,只能使用未绑定方法。

python super()函数:调用父类的构造方法的更多相关文章

  1. 使用super调用父类的构造方法

    package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...

  2. java基础 super 子类调用父类

    如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...

  3. 面向对象--继承-通过super()来调用父类方法

    super()的使用 问题: class Master(object): def __init__(self): self.kongfu = "古法煎饼果子配方" # 实例变量,属 ...

  4. python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名: Vehicle.__init__(self,name,speed,load,power)#调用父类的实例 Vehicle.run(self) #调用父类的方法 # ...

  5. Python super() 函数的概念和例子

    概念: super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重 ...

  6. super方法 调用父类的方法

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  7. Python super() 函数

    super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果重定义某个方法,该方法会覆盖父类的同名方法,但有时 ...

  8. python super()函数详解

    引言: 在类的多继承使用场景中,重写父类的方法时,可能会考虑到需要重新调用父类的方法,所以super()函数就是比较使用也很必要的解决方法: 文章来源: http://www.cnblogs.com/ ...

  9. python中子类调用父类的方法

    1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...

随机推荐

  1. liunx重定向控制台消息

    Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...

  2. H3C端口角色的确定

  3. jquery ajax请求步骤

    $.ajax({ type: "GET", url: "/alink-hq/checkCode", data: { "mobile": ph ...

  4. Vue中通过属性绑定为元素绑定style行内样式

    1.直接在元素上通过:style的形式,书写样式对象 2.将样式对象定义在data中,并直接引用到:style中 3.在:style中通过数组,引用多个data上的样式对象

  5. 2018 CCPC 吉林站 H Lovers

    2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...

  6. MFC入门

    目录 001.MFC_应用程序类型    002.MFC_对话框_静态文本_编辑框  003.MFC_对话框_访问控件_7种方法_A   004.MFC_对话框_访问控件_7种方法_B   005.M ...

  7. .bash_profile 文件

    1,当 .bash_profile 文件输入有误的时候,所有命令行都会不好使 输入 export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin ...

  8. python基础[16]——解决django连接mysql数据库报错的问题

    Models.py #创建数据表 from django.db import models from django.utils import timezone from tinymce.models ...

  9. PSR-1之PHP代码文件必须以不带BOM的UTF-8编码

    BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符 ...

  10. pyspider 安装使用过程的一些坑

    1.没有正确安装对应版本的pycurl 原因分析: PyCurl 安装错误,需要安装 PyCurl 库(PyCurl 是一个Python接口,是多协议文件传输库的 libcurl.类似于urllib ...