Python super()方法原理详解

在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法。

构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象创建后会立即调用,比如像实例化一个类:

f = FooBar()
f.init()#手动初始化

使用构造方法就能让它简化成如下形式:对象创建后自动调用魔法方法__init__(),对对象进行初始化操作

f = FooBar()

在明白了构造方法之后,来点进阶的问题,那就是父类的构造方法中的初始值无法继承的问题。

class Bird:
  def __init__(self):
     self.hungry = True
  def eat(self):
     if self.hungry:
        print 'Ahahahah'
     else:
        print 'No thanks!'

class SongBird(Bird):
   def __init__(self):
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

sb = SongBird()
sb.sing()  # 能正常输出
sb.eat()   # 报错,因为 songgird 中没有 hungry 特性

解决这个问题的办法有两种:

1、调用未绑定的超类构造方法(不推荐)

class SongBird(Bird):
   def __init__(self):
     Bird.__init__(self) #
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

2、使用super函数(推荐)

class SongBird(Bird):
   def __init__(self):
     super(SongBird,self).__init__()
     self.sound = 'Squawk'
   def sing(self):
     print self.song()

原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

super() 函数是用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重

复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。(菜鸟文档)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 对Python3之方法的覆盖与super函数详解

    #覆盖 覆盖:在继承关系中,子类实现了与基类同名的方法,在子类的实例调用该方法时,实例调用的是子类的覆盖版本. 通俗的讲,就是小明继承了他⑧的自行车,经过自己的改装,成了电动车,那么小明每次骑的就是电动车了(这个电动车是可以脚蹬的,后边栗子会继续使用) 举个简单的栗子: class Bicycle(): def run(self): print('我是自行车的run方法') class E_Bicycle(Bicycle): # 继承自行车 def run(self): print('我是电动车

  • python super函数使用方法详解

    一.super函数简介 python内置函数super()主要用于类的多继承中,用来查找并调用父类的方法,所以在单重继承中用不用 super 都没关系:但是,使用 super() 是一个好的习惯.一般我们在子类中需要调用父类的方法时才会这么用: 二.super函数语法 super(type,object-or-type) 参数: type - 类,一般是类名: object-or-type - 类,一般是 self: 返回值:无 三.super函数使用 1.案例一: # !usr/bin/env

  • python super的使用方法及实例详解

    功能 super功能:super函数是子类用于调用父类(超类)的一个方法. 用法 1.在子类 __init__() 方法中正确的初始化父类,保证相同的基类只初始化一次. 2.覆盖特殊方法. 3.解决多重继承中,子类重复调用父类方法的问题. 注意 super()继承只能用于新式类,用于经典类时就会报错. 新式类:必须有继承的类,如果无继承的,则继承object 经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not clas

  • Python中的super()方法使用简介

    子类里访问父类的同名属性,而又不想直接引用父类的名字,因为说不定什么时候会去修改它,所以数据还是只保留一份的好.其实呢,还有更好的理由不去直接引用父类的名字, 这时候就该super()登场啦-- class A: def m(self): print('A') class B(A): def m(self): print('B') super().m() B().m() 当然 Python 2 里super() 是一定要参数的,所以得这么写: class B(A): def m(self): p

  • 深入理解Python中的super()方法

    前言 python的类分别有新式类和经典类,都支持多继承.在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现 python语言与C++有相似的类继承,在类定义时,python中会自定义第一个self,类似C++中this指针,指向对象自身. python简单的类举例: >>> class hello(object): ... def print_c(): ... print"hello world!" >&g

  • Python 继承,重写,super()调用父类方法操作示例

    本文实例讲述了Python 继承,重写,super()调用父类方法操作.分享给大家供大家参考,具体如下: demo.py(继承,重写,super): # 父类 class Dog: def bark(self): print("汪汪叫") # 子类 继承 class XiaoTianQuan(Dog): def fly(self): print("我会飞") # 可以重写父类中的同名方法 def bark(self): # super().父类方法名 调用父类中的方

  • Python使用Supervisor来管理进程的方法

    本文实例讲述了Python使用Supervisor来管理进程的方法.分享给大家供大家参考.具体分析如下: Supervisor可以启动.停止.重启*nix系统中的程序.也可以重启崩溃的程序. supervisord的一个守护进程,用于将指定的进程当做子进程来运行. supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程. 看例子: 我们写了一个py脚本,用于往log文件中记录一条当前的时间. root@ubuntu:/home/zoer# cat daemon.py

  • Python super()方法原理详解

    在学习 Python 类的时候,会碰见类中有 __init__() 这样一个函数,其实它就是 Python 的构造方法. 构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象创建后会立即调用,比如像实例化一个类: f = FooBar() f.init()#手动初始化 使用构造方法就能让它简化成如下形式:对象创建后自动调用魔法方法__init__(),对对象进行初始化操作 f = FooBar() 在明白了构造方法之后,来点进阶的问题,那就是父类的构造方法中的初

  • Python rstrip()方法实例详解

    Python 字符串 描述 Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格). 语法 rstrip()方法语法: str.rstrip([chars]) 参数 chars – 指定删除的字符(默认为空格) 返回值 返回删除 string 字符串末尾的指定字符后生成的新字符串. 实例 以下实例展示了rstrip()函数的使用方法: #!/usr/bin/python str = " this is string example-wow!!! "; p

  • Java binarysearch方法原理详解

    这篇文章主要介绍了Java binarysearch方法原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先 数组排序需要import java.util.Arrays类 binarysearch有两个用法,一个是在整个数组里搜索,一个是在指定范围搜索,其实都是差不多的,可以将前者视为后者的特殊情况. 用法1 binarySearch(Object[], Object key) Object是目标数组,key是目标值,要求目标数组必须要

  • Python rindex()方法案例详解

    描述 Python rindex() 方法返回子字符串最后一次出现在字符串中的索引位置,该方法与 rfind() 方法一样,只不过如果子字符串不在字符串中会报一个异常. 语法 rindex() 方法语法: S.rindex(sub[,start=0[,end=len(S)]]) 参数 sub -- 指定检索的子字符串 S -- 父字符串 start -- 可选参数,开始查找的位置,默认为0.(可单独指定) end -- 可选参数,结束查找位置,默认为字符串的长度.(不能单独指定) 返回值 返回子

  • python super()函数的详解

    目录 super的用法 super的原理 总结 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用. super的用法 看下面一个例子: class A: def func(self): print(

  • python super()函数的详解

    目录 super的用法 super的原理 总结 Python是一门面向对象的语言,定义类时经常要用到继承,在类的继承中,子类继承父类中已经封装好的方法,不需要再次编写,如果子类如果重新定义了父类的某一方法,那么该方法就会覆盖父类的同名方法,但是有时我们希望子类保持父类方法的基础上进行扩展,而不是直接覆盖,就需要先调用父类的方法,然后再进行功能的扩展,这时就可以通过super来实现对父类方法的调用. super的用法 看下面一个例子: class A: def func(self): print(

  • 关于python字符串方法分类详解

    python字符串方法分类,字符串是经常可以看到的一个数据储存类型,我们要进行字符的数理,就需要用各种的方法,这里有许多方法,我给大家介绍比较常见的重要的方法,比如填充.删减.变形.分切.替代和查找. 打开sublime text 3编辑器,新建一个PY文件. test = "hey" test_new = test.center(10, "$") print(test_new) 填充类的有center()这个方法,可以指定字符,然后往两边填充,第一个参数是总的字符

  • ES6 class类链式继承,实例化及react super(props)原理详解

    本文实例讲述了ES6 class类链式继承,实例化及react super(props)原理.分享给大家供大家参考,具体如下: class定义类是es6提供的新的api,比较直观,class类继承也有着一定的规律性,在egg, webpack等库的源码中有着很多的应用场景.结合一些初学者可能遇到的难点,本文主要对其链式继承进行总结,关于super关键字的使用请参考我的其他文章es6中super关键字的理解. class定义 class App { constructor(options){ su

  • Python字符串split及rsplit方法原理详解

    1.描述 split()方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则分隔num+1个子字符串,默认分隔符为所有空字符,包括空格.换行(\n).制表符(\t)等 rstrip()方法通过 2.语法 str.split([sep=None][,count=S.count(sep)]) str.rsplit([sep=None][,count=S.count(sep)]) 3.参数 sep -- 可选参数,指定的分隔符,默认为所有的空字符,包括空格.换行(\n).制表符(\t)等 c

  • 浅谈js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对http://store.company.com/dir/page.html同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 一.通过jsonp跨域 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同

随机推荐