Python类定义中object与list作为父类的作用及继承相关疑问
问题解答
类定义中object、list参数的作用
Python类定义时,括号内填写的是该类要继承的父类,你提到的两个参数本质都是指定继承的父类:
class Card(object):这里是显式声明Card继承Python所有类的顶级基类object,这是Python2时期区分新式类和经典类的写法,Python3中即使省略括号写成class Card:,也会默认继承object,属于新式类。- 补充:不是传入
object就说明Card是基类,基类是相对概念:Card相对于object是子类,如果你后续定义其他类继承Card,那Card就是那个子类的父类(基类)。PyCharm提示里的「基类」指的是object本身是所有类的顶层基类,不是指Card是基类。
- 补充:不是传入
class StandardDeck(list):这里是显式声明StandardDeck继承Python内置的list类,因此StandardDeck属于自定义列表类,原生拥有普通列表的所有功能(比如append、pop、支持for循环遍历等)。
关于super().__init__()的疑问
这里的super().__init__()调用的是**list类的初始化方法**,和Card类没有任何关系:
super()会按继承链找当前类的直接父类,StandardDeck的父类是list,自然调用的是list的构造方法,初始化一个空列表,后续你往self里append的Card实例,都是存在这个自定义列表里的元素。StandardDeck和Card是组合关系(前者存储后者的实例),没有继承关系,所以不会调用到Card的任何方法。
验证小技巧
你可以打印类的方法解析顺序(继承链)来确认继承关系,在代码里加入如下代码即可:
print(StandardDeck.__mro__)
输出结果为:(<class '__main__.StandardDeck'>, <class 'list'>, <class 'object'>),可以明确看到继承链里没有Card类。
内容的提问来源于stack exchange,提问作者Rdam88
相关产品推荐
相关产品推荐

