理解python super()类

首先我们通过网友在stackoverflow关于python super类的一个疑问来作为本篇的开始,问题大致是这样的:

>>> class A(object):
...     def __init__(self):
...             print "A init"
...             super(A,self).__init__()
...
>>>
>>> a = A()
A init
>>> class B(object):
...     def __new__(self):
...             print "B new"
...             super(B,self).__new__()
...
>>>
>>> b = B()
B new
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __new__
TypeError: object.__new__(): not enough arguments
>>> 

可以看到如果按照调用super类的__init__()方法一样调用__new__()类,会报错的,报错说参数不够。下面的代码是正确的使用super类的__new__()方法。

>>>
>>> class B(object):
...     def __new__(self):
...             print "B new"
...             super(B,self).__new__(self)
...
>>>
>>> b = B()
B new
>>> 

为什么需要在super类的__new__(self)显示的传递类和类实例?

因为__new__是一个static method静态方法,静态方法是脱离了类本身之外的一个方法,所以他并没有绑定类(类实例)自己作为隐式参数传递,所以super(...).__new__返回的也是一个static method静态方法。所以需要显示的传递。详细移步阅读 http://www.python.org/download/releases/2.2/descrintro/#__new__

super()是什么?

super()是什么? super是一个内建的type。在对象中使用super经常会让人产生错觉,令人认为返回的父类对象。其实不然,实际上他返回的是super类的一个对象。实例化的时候,第一个参数是一个类型(type),第二个参数可以是type的instance实例,也可以是type的subclass。你调用 super(Base, self) 会返回一个 __class__ = super 的对象,这个对象可以作为一个代理,通过BFS的顺序去访问第一个直接定义了目标属性的基类里的属性。实际上并不是非要用self作为super的第二个参数,甚至super并不是必须在class内部才能调用:

>>> class A(object):
...     def foo(self):
...             print self.name
...
>>> class B(A):
...     def __init__(self, name):
...             self.name = name
...
>>> b = B(‘b‘)
>>> super(B, b).foo()
b
>>> 

关于静态方法的探讨可以查看我之前的一篇:

http://www.cnblogs.com/kennyhr/p/3935465.html

本文参考资料:

http://segmentfault.com/q/1010000000267263

时间: 2024-10-10 19:48:31

理解python super()类的相关文章

深入理解python元类

类也是对象 在理解元类之前,你需要先掌握Python中的类.Python 中的类概念借鉴 Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.当然在 Python 中这一点也是成立的. >>> class ObjectCreator(object): ... pass ... >>> my_object = ObjectCreator() >>> print my_object <__main__.

理解Python元类(转)

add by zhj:先收藏了,有时间看,图倒是不少,可以配合stackover flow上那篇文章一起看 原文:http://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/ None of the existing articles [1] give a comprehensive explanation of how metaclasses work in Python so I'm making my own. Me

Python的类和对象 入门级讲解(简单粗暴)

前言:本人是Python初学者.在学到Python的类和对象的时候,被'高深'的概念虐得死去活来.上网提问,得到的回复几乎都是'大神们'藏着掖着迫不得已才挤出来的只言片语:上网搜文章,长长的篇幅,那些字都认得,但是就是不知道是什么意思,并且都是反复地复制粘贴而导致文章排版极其辣眼睛. 一个阴郁的冬天,我在YouTube上搜到一个视频作者John Philip Jones,发现一个关于Python类和对象的讲解.这是目前为止我看到的最利于小白学习Python的讲解方法.由于在国内上YouTube不

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

深刻理解Python中的元类

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

理解python的元类

看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创建实例,类创建不同的实例,虽然每个实例都有类似的属性,方法,但具体都是不一样的! class Fruits(): def __init__(self,name,color): self.name=name self.color=color def __new__(cls,name,color): r

04 Python的继承、方法重写、super()类

继承 A类继承B类,A即可获得B类的全部公共属性和方法.格式如:class A(B): class Animal: def sleep(self): print("zZZ...") def eat(self): print("yamiyami...") def run(self): print("huchihuchi...") class Dog(Animal): #Dog类拥有sleep,eat,run,bark四个方法 def bark(se