对python的super方法的用法理解
参考链接:https://www.cnblogs.com/dkblog/archive/2011/02/24/1980654.html
https://www.cnblogs.com/wjx1/p/5084980.html
python中对象的方法第一个参数一般都是self,用于传递对象本身。但是在调用的时候不必显示传递,python会自动传递:
class Example(object): # 在Example类中定义一个function方法,function仅用来print传递进来的参数。
def function(self, message):
print message
>>>Example().function('helloworld')
helloword
当子类需要调用父类中的方法时,需要将self参数显示传递:
class Parent(object): # 在Parent类中定义一个function_a方法,function仅用来print传递进来的参数。
def function_a(self, message):
print message
def funtion_b(self): # 在Parent类中定义一个function_b方法,用来print 'hi'字符串。
print 'hi'
class Child(Parent): # 在Child类中定义一个function_a方法来调用父类的function_b方法。
def function(self, message):
Parent.function_b(self)
print message
>>>Child().function('helloword')
hi
helloworld
这样做的坏处是如果修改了父类的名称,那么子类就可能会涉及多出修改,当多继承时修改的地方就会更多,这种方法这样就会显得累赘。
为了解决这些问题,python引入了super()机制,例子代码如下:
class Parent(object):
def function_a(self, message):
print message
def function_b(self):
print 'hi'
class Child(Parent):
def function(self, message):
super(Child, self).function_b()
print message
>>>Child().function('helloworld')
hi
helloworld
当你想继承了父类的方法但是又想对该方法做一些改变的时候用super。其实说白了super就是把父类中的代码给复制粘贴到子类中方便子类修改。
从运行结果上看,普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
注意:super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』
更详细的参考
http://blog.csdn.net/johnsonguo/article/details/585193
总结
1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
产生了一个super对象;
2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
只调用一次(如果每个类都使用super);
5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
个父类函数被调用多次。
对python的super方法的用法理解的更多相关文章
- Python中sorted()方法的用法
Python中sorted()方法的用法 2012-12-24 22:01:14| 分类: Python |字号 订阅 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对i ...
- Python中super函数的用法
之前看python文档的时候发现许多单继承类也用了super()来申明父类,那么这样做有何意义? 从python官网文档对于super的介绍来看,其作用为返回一个代理对象作为代表调用父类或亲类方法.( ...
- Python面试题之Python的Super方法
我们最常见的,可以说几乎唯一能见到的使用super的形式是: class SubClass(BaseClass): def method(self): super(SubClass, self).me ...
- python中super()的一些用法
在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白 ...
- python中super关键字的用法
http://python.jobbole.com/86787/ class A: def __init__(self): print "enter A" print ...
- python中__call__()方法的用法
__call__()的用法 __call__()方法能够让类的实例对象,像函数一样被调用: >>> >>> class A(object): def __call_ ...
- Python中sorted()方法
Python中sorted()方法的用法 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.i ...
- 关于Python的super用法研究
一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(se ...
- 关于Python的super用法
Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递. 举一个很常见的例子: >> ...
随机推荐
- 如何让其他电脑访问到自己的Django项目
1.首先修改setting.py文件 ALLOWED_HOSTS = ['*'] 2.运行时使用该命令 python3 manage.py runserver 0:8000 备注:如果上* 为固定的i ...
- Django简单实例
一.前戏-MVC框架与MTV框架 1.MVC MVC(Model View Controller),是一种软件工程开发的架构模式,不仅适用于软件开发,而且适用于其他广泛的设计和组织工作,主要思想通过分 ...
- 微信小程序 地图地址解析
1.微信小程序提供了几个方式,引入地图, wx.getLocation(OBJECT) 获取当前的地理位置.速度.当用户离开小程序后,此接口无法调用:当用户点击“显示在聊天顶部”时,此接口可继续调用 ...
- python 匿名函数捕获变量值 (执行时的值)
- HTTP请求中POST与GET的区别
本文章已收录于: 一.原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式. ...
- elasticsearch 索引备份恢复
备份脚本 es_backup.sh : #!/bin/bash#备份昨天数据,删除30天前索引 host=`hostname`address="xxx@xxx.com" es_us ...
- 【Alpha】Scrum Meeting 2
前言 第2次会议在3月28日由PM在教一317召开. 主要确定了项目方向和目标功能,进行了任务分工.时长60min. 任务分配 姓名 当前阶段任务 下阶段任务 吴昊 熟悉代码和配置环境,发布手机端博客 ...
- java中什么是泛型
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...
- iOS开发 -------- storyBoard实现控制器添加childViewController
1 拖进去scrollView 添加约束(0,0,0,0); 2 更新scrollView约束,然后在scrollView上面加个view,设置其约束为(0,0,0,0) 和 水平滑动约束; ...
- build tool 的简单认知
Build Tool 什么是Build Tool(构建工具)? 构建工具是从源代码自动创建可执行应用程序的程序(例如.apk for android app).构建包括将代码编译,链接和打包成可用或可 ...