Python中类的__init__(self, *args, **kwargs)初始化
我刚开始学习Python。在我正在做的一个OpenFlow控制器中,我遇到了一些Python代码。
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(SimpleSwitch, self).__init__(*args, **kwargs)
self.mac_to_port = {}
我有以下几个问题。
__init__
是类的构造函数吗?self
和C++中的this
指针是一样的吗?super(SimpleSwitch, self).__init__(*args, **kwargs)
的意思是调用父类的构造函数吗?你可以像
mac_to_port
那样给self
添加一个新成员吗?还是说这个成员已经添加过,只是在这里初始化?
2 个回答
0
- 在Python中,super的用法和C++里的super不一样。我虽然没用过C++,但可以告诉你,Python里的super不是用来直接调用父类的。相反,Python的super会先调用当前类的子类,然后再按照一个有趣的顺序进行调用。想象一下一个三层的类结构,最底层有一个基础类,基础类下面有两个子类,而这两个子类又各自有两个子类。如果在最底层调用super,它会直接调用它上面的父类;但如果在第二层的某个类中调用super,它会先调用自己层级的子类,然后再去调用同层的其他类,最后再调用这些同层类的子类。等到所有同层类和它们的子类都被调用完后,super才会去调用中间层类的父类。
用语言解释起来有点难。可以去看看Raymond Hettinger在PyCon上的演讲“super considered super”。他对这个概念的解释非常好,也讲解了为什么Python里的super不应该叫做“super”。
8
__init__
是初始化方法;__new__
是构造方法。你可以看看这个问题来了解更多:这个链接。- 基本上是的:在 Python 中,实例方法的第一个参数通常叫做
self
,它代表的是实例本身。 - 是的,这里是在调用父类的初始化方法。
- 这段代码是在给
SimpleSwitch
添加一个新的属性,除了父类已经有的内容外,还增加了一个空字典。