


When a subclass needs to call a method of the parent class, before python2.2, the method of the class is directly called using the class name, that is, a non-bound class method, and the own object self is passed in as a parameter.
class A(object): def say(self): print 'I am A' class B(A): def say(self): print 'I am B' A.say(self) b = B() b.say()
Output
I am B I am A
This works great , but there is a problem. When the parent class changes its name, these explicit calls to the parent class must be corrected one by one. The coupling between the subclass and the parent class is relatively high.
So the super() function was introduced after Python 2.2 to avoid hard coding and no need to care about the name of the parent class.
Using the super() function, the above code can be written as follows.
class B(A): def say(self): print 'I am B' super(B,self).say()
After python3.0, improvements have been made. The super() function does not need to pass parameters, that is, the above line of code directly super(). Just say() will do.
Things to note:
super can only be used in new-style classes.
Super has a problem with multiple inheritance. If a subclass inherits multiple parent classes, then super calls the method of the first parent class.
Don’t mix these two methods of calling parent class methods, either use unbound class methods or both use super. Otherwise, it may not be called or may be called multiple times.
BUT:
Don’t think of the parent class when you think of super! super refers to the next class in MRO!
When talking about super, I think of the parent class. This is a mistake that beginners can easily make, and it was also a mistake I made back then.
def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1]
The two parameters cls and inst do two things respectively:
1. inst is responsible for generating the MRO list
2. Locate the index in the current MRO through cls, and return mro[index + 1]
These two things are the essence of super, you must remember it!
MRO stands for Method Resolution Order, which represents the order of class inheritance.
For example:
class Root(object): def __init__(self): print("this is Root") class B(Root): def __init__(self): print("enter B") # print(self) # this will printsuper(B, self).__init__() print("leave B") class C(Root): def __init__(self): print("enter C") super(C, self).__init__() print("leave C") class D(B, C): pass d = D() print(d.__class__.__mro__)
Output
enter B enter C this is Root leave C leave B (,,,,)
After knowing that super has no real relationship with the parent class, it is not difficult for us to understand why the next sentence of enter B is enter C instead of this is Root (if you think super represents "calling the method of the parent class", you will I take it for granted that the next sentence should be this is Root). The process is as follows, in the __init__ function of B:
super(B, self).__init__()
First, we get self.__class__.__mro__. Note that self here is the instance of D. Instead of B's
(
, then, use B to locate the index in the MRO and find the next one. Obviously B's next one is C. So, we call C's __init__ and type enter C.
By the way, why B's __init__ will be called: Because D does not define __init__, so we will find the next class in MRO to see if it has __init__ defined, that is, to call B's __init__.
In fact, the logic of all this is still very clear. The key is to understand what super does.
The above is the correct understanding and usage analysis of the super function in Python programming. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

WebStorm Mac version
Useful JavaScript development tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SublimeText3 Chinese version
Chinese version, very easy to use

Dreamweaver Mac version
Visual web development tools