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

6

我是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 的新成员吗?还是已经添加并在此进行初始化了?


4
建议你阅读Python教程以了解Python类的基础知识。链接:http://docs.python.org/2/tutorial/ - BrenBarn
2个回答

8
  1. __init__ 是初始化方法;__new__ 是构造方法。详见例如这个问题
  2. 实际上是的:在Python中,实例方法的第一个参数按惯例称为 self,表示实例本身。
  3. 调用父类的初始化方法,是的。
  4. 它在 SimpleSwitch 中添加了一个新属性,除了父类已有的空字典之外。

如果SimpleSwitch没有超类呢? - liv2hak
2
另外,在Python中,self是一种惯例,而在C++中,this则是一个关键字。 - juanchopanza
2
__init__ 更类似于 C++ 的构造函数而不是 __new__。构造函数并不会创建一个新对象 - 相反,在新创建的对象上隐式运行它,并在将其返回给调用代码之前运行,非常类似于 __init____new__ 创建并返回一个新对象(或可能检索并返回一个内部对象),使其更像 C++ 的 operator new - lvc
@jonrsharpe - 噢,父类是在类定义中指定的参数吗? - liv2hak
在Python 3中,每个Python类都是object内置类的子类,如果它没有继承其他类。在Python 2中,建议始终继承object(使其成为“新风格类”),因为不继承object的情况(旧风格类)只是为了向后兼容而保留的 - 而且其中一个不同之处是super在旧风格类上不起作用。 - lvc

0
Python中的super不像C++中的super。我没有使用过C++,但我可以告诉你,在python中,super并不起到相同的作用。Python的super不是调用父类,而是调用在super所在类的子类,然后按照一个有趣的链条移动。想象一下三层级的类系统,其中有一个单一的基类,两个派生自该基类的子类,以及这些子类的两个子类。在底层调用super会立即调用其上面的父类,但在第二层类中的一个类中调用super会先调用它们的子类,然后向侧面看并调用同一层级上的其他类,然后调用该同一层级类的子类。一旦所有同一层级的类及其子类都被调用,那么super就会调用中间层级类的父类。

很难用言语解释。观看Raymond Hettinger在PyCon上的“超级考虑”演讲。他非常好地解释了它的工作原理,以及为什么不能称Python的super为“super”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接