Python中是否支持super().__init__().area()这类方法调用方式?
问题解答
1. 关于super().__init__().area()的调用合法性与含义
- 语法层面这种链式写法是允许的,但完全不符合Python的编码规范,99%的场景下都属于错误写法
- 具体逻辑:
super().__init__()是调用父类的构造方法,Python规定__init__()方法默认返回None,只有主动在__init__里return self(违反规范的操作)时,后续接方法调用才不会报错。你当前的报错是因为父类Square的__init__要求传入side参数,你调用时没有传,所以先抛出了参数缺失的错误。 - 你想要实现调用父类的
area方法,直接写super().area()即可,不需要额外调用__init__,子类实例化的时候已经自动调用过父类的构造方法完成初始化了。
2. __init__与super()的参数规则
__init__参数规则:第一个参数固定是当前实例self,不需要手动传入,后续的参数是实例化类时需要传入的自定义参数。如果要手动调用父类的__init__,需要把对应参数完整传入,比如你代码里需要写成super().__init__(side)才是合法调用。super()参数规则:Python3中super()可以不传参数,默认会自动传入当前类和self实例,等价于super(Cube, self);如果是Python2版本则必须显式传入这两个参数。super()返回的是父类的代理对象,直接用这个对象即可调用父类的方法和属性。
修正后的可运行代码
class Square(): def __init__(self, side): self.side = side def area(self): return self.side * self.side class Cube(Square): def area(self): # 直接调用父类的平面面积方法乘6,得到立方体表面积 return super().area() * 6 def volume(self): # self.side是实例属性不是方法,不需要加括号 return super().area() * self.side c = Square(4) # 调用Square的area方法,输出16 print(c.area()) d = Cube(4) # 调用Cube重写后的area方法,输出96 print(d.area()) # 调用volume方法,输出64 print(d.volume())
内容的提问来源于stack exchange,提问作者shaila
相关产品推荐
相关产品推荐

