Python中类的__init__(self, *args, **kwargs)初始化

6 投票
2 回答
19325 浏览
提问于 2025-04-18 02:27

我刚开始学习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 = {}

我有以下几个问题。

  1. __init__是类的构造函数吗?

  2. self和C++中的this指针是一样的吗?

  3. super(SimpleSwitch, self).__init__(*args, **kwargs)的意思是调用父类的构造函数吗?

  4. 你可以像mac_to_port那样给self添加一个新成员吗?还是说这个成员已经添加过,只是在这里初始化?

2 个回答

0
  1. 在Python中,super的用法和C++里的super不一样。我虽然没用过C++,但可以告诉你,Python里的super不是用来直接调用父类的。相反,Python的super会先调用当前类的子类,然后再按照一个有趣的顺序进行调用。想象一下一个三层的类结构,最底层有一个基础类,基础类下面有两个子类,而这两个子类又各自有两个子类。如果在最底层调用super,它会直接调用它上面的父类;但如果在第二层的某个类中调用super,它会先调用自己层级的子类,然后再去调用同层的其他类,最后再调用这些同层类的子类。等到所有同层类和它们的子类都被调用完后,super才会去调用中间层类的父类。

用语言解释起来有点难。可以去看看Raymond Hettinger在PyCon上的演讲“super considered super”。他对这个概念的解释非常好,也讲解了为什么Python里的super不应该叫做“super”。

8
  1. __init__ 是初始化方法;__new__ 是构造方法。你可以看看这个问题来了解更多:这个链接
  2. 基本上是的:在 Python 中,实例方法的第一个参数通常叫做 self,它代表的是实例本身。
  3. 是的,这里是在调用父类的初始化方法。
  4. 这段代码是在给 SimpleSwitch 添加一个新的属性,除了父类已经有的内容外,还增加了一个空字典。

撰写回答