- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python里 super类的工作原理详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
super 的工作原理如下:
1
2
3
|
def
super
(
cls
, inst):
mro
=
inst.__class__.mro()
return
mro[mro.index(
cls
)
+
1
]
|
其中,cls 代表类,inst 代表实例,上面的代码做了两件事:
当你使用 super(cls, inst) 时,python 会在 inst 的 mro 列表上搜索 cls 的下一个类.
下面看一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class
a:
def
__init__(
self
):
self
.n
=
2
def
add(
self
, m):
print
(
'\n\nself is {0} @a.add'
.
format
(
self
))
self
.n
+
=
m
class
b(a):
def
__init__(
self
):
self
.n
=
3
def
add(
self
, m):
print
(
'\n\nself is {0} @b.add'
.
format
(
self
))
super
(b,
self
).add(m)
self
.n
+
=
3
class
c(a):
def
__init__(
self
):
self
.n
=
4
def
add(
self
, m):
print
(
'\n\nself is {0} @c.add'
.
format
(
self
))
super
(c,
self
).add(m)
self
.n
+
=
4
class
d(b, c):
def
__init__(
self
):
self
.n
=
5
def
add(
self
, m):
print
(
'\n\nself is {0} @d.add'
.
format
(
self
))
print
(
super
(d,
self
).__self__)
print
(
super
(d,
self
).__thisclass__)
super
(d,
self
).add(m)
self
.n
+
=
5
if
__name__
=
=
'__main__'
:
print
(d.mro())
d
=
d()
d.add(
2
)
# 等于是: d.add(d, 2)
print
(d.n)
|
结果是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[<
class
'__main__.d'
>, <
class
'__main__.b'
>, <
class
'__main__.c'
>, <
class
'__main__.a'
>, <
class
'object'
>]
<__main__.d
object
at
0x101ef16d8
>
self
is
<__main__.d
object
at
0x101ef16d8
> @d.add
<__main__.d
object
at
0x101ef16d8
>
<
class
'__main__.d'
>
self
is
<__main__.d
object
at
0x101ef16d8
> @b.add
self
is
<__main__.d
object
at
0x101ef16d8
> @c.add
self
is
<__main__.d
object
at
0x101ef16d8
> @a.add
19
|
来通过这个结果具体说几点细节:
print(d.mro()) 首先打印出 d类的 mro 列表:[<class '__main__.d'>, <class '__main__.b'>, <class '__main__.c'>, <class '__main__.a'>, <class 'object'>] 。 这个非常好理解.
然后我们通过d = d()创建一个d类的实例: <__main__.d object at 0x101ef16d8>; 为了方便, 我们就把这个实例object at 0x101ef16d8 叫做 “小明” 吧 。
召唤d.add(2) 这个函数的时候,d类中add函数的self实际上就是这个刚被创建的小明同学object at 0x101ef16d8. 。
那么接下来呢,super(d, self) 就是在 object at 0x101ef16d8 的mro列表中,在小明的mro列表中, 找到 class d(d类)的下一个 class(类), 这里也就是 class b (b类) .
注意 mro列表里 <class '__main__.d'> 的下一个是 <class '__main__.b'> 。
每一个 add 函数打印的都是 self is <__main__.d object at 0x101ef16d8>, 往上追溯的过程中,无论到了哪一级,self始终都是最初创建的那个 d类的实例.
这是为什么呢?
注意看 print(super(d, self).__self__) 那一行返还的输出:<__main__.d object at 0x101ef16d8> . 。
哦哦?! 这他妈的不是小明吗?
也就是说, super()虽然找到的是b类,召唤的是b类的 add()函数,但它的self仍然是最开始创建的d类实例(我们的 小明同学),而且召唤add()这个函数时,仍然是把这样的一个self传给了 class b 的 add()函数.
我们的 “小明”, 就这样被一次次的往上传导到了每一级的 add() 函数中, 于是每一级打印的都是:
self is <__main__.d object at 0x101ef16d8> 或者说: self is 小明 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://segmentfault.com/a/1190000019518696 。
最后此篇关于python里 super类的工作原理详解的文章就讲到这里了,如果你想了解更多关于python里 super类的工作原理详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个设计。我在这里遇到一个问题。 我要做的是,我必须显示前 3 个 li 标签的 100% 宽度,并保留 li 标签的 33.33%。 这是我的预期输出 li-100% width li-100%
用例: 对于我的 angularJS(1.6.4) 应用程序,我正在用 jasmine 编写单元测试。 在我的测试用例中,我调用了一个 poll() 函数,该函数使用 $interval 反复调用另一
如何在 hookdisplayTop 中获取当前产品? 这是我确保我在“产品”页面中的当前方式: if ( Dispatcher::getInstance()->getController() ==
我有一个带有“li”-s 的导航菜单。我想像这样把这个 li 变成六 Angular 形: 我该怎么做? 最佳答案 我会使用带边框的伪元素。 * { margin: 0; paddin
我是 JQuery 的新手。我试图基本上允许访问者在我的网站上的两种颜色主题之间进行选择。当他们单击浅色主题的链接时,除了我的导航菜单中的各种元素外,所有内容都会按预期改变颜色。这是 JQuery:
所以我试图在我的 Accordion 中的一些文本下面实现一个日期。 文本和图像由用户插入到 wordpress 的文章部分,日期应始终显示在文本下方。但是一直报错,一直在1970。 下面的代码:
我需要在一段时间内将测试数据提供给 Swing 间隔。数据集需要很长时间才能解析,所以我使用 SwingWorker 在后台解析它。在将数据馈送到 GUI 时(例如,每秒一个项目),我可以从 Swin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 prev next function showPage(page) { var listItems =
里?
我有一个小程序,其中有冰淇淋口味列表,计算机使用“console.log();”打印一个句子和味道。我已经开始了这个项目,它看起来像这样: var randomFlavour = Math.rando
我想创建自定义 toast,其中一个 View 有点脱离父 View 。所以我做了这样的事情 这是我定制的 toast round_button.xml
在过去的 6 个月里,我一直在从 repl 运行我的 Clojure 应用。 也就是说,每当我想运行该应用程序时,我都会加载一个 clojure repl,然后输入:(load-file "src/r
我想在我的网页的整个主体周围添加一个边框。 我创建了一个布局,其中包含一个主体,其中包含多个 div 标签。我添加了我认为会在所有内容周围放置边框的 CSS。不幸的是,出于某种原因,我布局中的最后两个
我有一个无序列表 (ul),我正在尝试制作 3 列。当我有 4 个 li's 时,它只显示 2 列。我怎样才能让它有 3 列和 4 个 li ? 此外,我希望 li 从左到右,而不是从上到下,如下所示
我目前正在使用 JPA 创建一个批处理,其层次结构为 Tasklet-> 访问器-> 服务-> 处理器,并且我正在使用 Glassfish 作为我的数据库。但当我运行时` [ERROR] [com.a
到目前为止我有这个: $(".actor ul li").not($(".actor ul li").slice(0,11)).hide(); 我还想从 hide() 中排除最后一个 li。我该怎么做
我必须使用 tools.jar 中的库并因此添加了此依赖项: com.sun tools 1.6.0 system ${java.home}/../lib/t
if(BrowserDetect.browser=="safari"){document.write('')} 我可以在 html 文档的底部放置条件注释吗? (在体内)还是应该在头部? 就页面速度
我是一名优秀的程序员,十分优秀!