Python无继承自定义类使用super().__init__()的合法性及报错问题咨询
问题解答
针对类型1代码的疑问
你在没显式写继承的Square类里写的super().__init__(),实际执行逻辑是调用Python所有类的根父类object的初始化方法:
- Python3里所有自定义类默认自动继承
object类,不存在完全无父类的类,所以super()在这里能找到对应的父类。 object的__init__方法本身不需要额外参数,也没有实际的业务逻辑,只是最基础的空初始化动作,所以只要你调用方式没错,不会报错。- 这段代码里的
super().__init__()对你自己写的Square类功能没有任何影响,写不写都一样。
补充:你贴的类型1代码里实例化时写的c = Square()是参数错误的,因为__init__定义了必填的side参数,改成c = Square(4)这类传参写法才能正常运行。
问题1:未继承其他类的新建自定义类中是否可以使用super().__init__()且正常运行?
可以,只要你调用super().__init__()的时候参数符合父类object的__init__要求(不需要传额外参数),就能正常运行,只是大多数场景下这么写没有实际意义。
问题2:为什么类型2代码会抛出TypeError: 'Square' object is not callable报错?
这个报错和你写的super()完全无关,问题出在你调用实例的方式错了:
e = Square()执行后,e是Square类的实例对象,不是函数。- 只有类实现了
__call__魔术方法的情况下,它的实例才能像函数一样用实例名()的方式调用,你没写这个方法,自然会报「对象不可调用」的错误。 - 你可以做个验证:把类型2代码里的
super().__init__()删掉再运行,还是会报一模一样的错。
内容的提问来源于stack exchange,提问作者shaila
相关产品推荐
相关产品推荐

