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. tensorflow在文本处理中的使用——辅助函数

    代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...

  2. Spring Boot 各Starter介绍

    原文链接:https://blog.csdn.net/u014430366/article/details/53648139 Spring-Boot-Starters 最通俗的理解- jar 包,引用 ...

  3. Tufurama CodeForces - 961E (cdq分治)

    题面 One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series " ...

  4. mapstatetoprops更新state但props不更新渲染的问题

    通过react-redux和redux实现react组件之间的通信,reducer.action.store都编写正确,mapDispatchToProps也能正确传值.唯独mapStateToPro ...

  5. Jenkins安装部署与使用

    一.Jenkins平台安装部署 Jenkins官网免费获取Jenkins软件,官网地址为:http://mirrors.jenkins-ci.org/下载稳定的Jenkins版本.由于Jenkins是 ...

  6. DRF框架中的异常处理程序

    目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...

  7. 假期汇总表handler中涉及的基础知识

    1,stringBuffer 的常用方法,append () 方法, public StringBuffer append(boolean b) 追加内容到当前StringBuffer对象的末尾 ,我 ...

  8. 毕业两年半,入手人生第一款macbook pro

    当程序员入手第一款macbook 大家好,我是灰大狼,你们可以叫我灰狼.大狼.甚至是小灰灰. 接下来我主要跟大家分享下作为程序员的我,刚入手一款mac的使用心得. 背景 做程序员三年了,一直用的都是w ...

  9. 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口

    数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...

  10. 推荐中的多任务学习-YouTube视频推荐

    本文将介绍Google发表在RecSys'19 的论文<Recommending What Video to Watch Next: A Multitask Ranking System> ...