Python继承中父类与子类能否为同一类?代码疑问解析
Python里这段super()代码到底是啥意思?
你说的“类自继承”其实是个误解,这段代码里的MyParentClass根本没继承自己,而是在构造方法里用super()调用了它的隐式父类的构造方法。
具体说清楚
- 在Python 3里,所有没显式指定父类的类,默认都会继承
object这个顶级基类;Python 2里这种定义方式属于“经典类”,没有默认父类。 - 代码里的
super(MyParentClass, self).__init__(),作用是调用当前类直接父类的__init__方法:- 要是在Python 3环境下,这句其实等价于
object.__init__(self),但object的构造方法本身啥也不干,所以执行了也没实际效果。 - 要是在Python 2环境下,这种经典类使用
super()会直接报错,因为经典类不支持这个语法。
- 要是在Python 3环境下,这句其实等价于
为啥有人写这种看起来没用的代码?
- 主要是为了方便以后扩展:比如哪天这个类要继承别的类了,改成
class MyParentClass(SomeOtherClass):,这句super()不用修改就能自动调用新父类的构造方法,不用手动改成SomeOtherClass.__init__(self)。 - 也可能是开发者的习惯,或者从别的有继承逻辑的类里复制代码过来没做修改。
举两个对比例子更明白
无显式继承的情况(Python 3)
class MyParentClass(): def __init__(self): super(MyParentClass, self).__init__() print("MyParentClass构造方法执行") obj = MyParentClass() # 输出: MyParentClass构造方法执行 # super调用的object.__init__没输出,因为它啥也不做
改成显式继承其他类的情况
class BaseClass(): def __init__(self): print("BaseClass构造方法执行") class MyParentClass(BaseClass): def __init__(self): super(MyParentClass, self).__init__() print("MyParentClass构造方法执行") obj = MyParentClass() # 输出: # BaseClass构造方法执行 # MyParentClass构造方法执行
这时候就能看到super()的作用了,它自动调用了新父类BaseClass的构造方法。
内容的提问来源于stack exchange,提问作者Lakpa Tamang
相关产品推荐
相关产品推荐

