使用超类方法作为实例方法

Using superclass methods as instance methods

我目前正在阅读 Luciano Ramalho 的优秀书籍 Fluent Python. In a chapter about interfaces and inheritance we build a subclass of a list (see github 以获取原始代码),我对我们定义其中一种实例方法的方式感到困惑。对于一个简单的例子,我的困惑是由以下情况引起的:

class ListWithLoadMethod(list):
    load = list.extend

生成一个新的列表子 class,它有一个 extend 方法的别名 load。我们可以通过写

来测试class
loaded_list = ListWithLoadMethod(range(4))
print(loaded_list)
loaded_list.extend(range(3))
print(loaded_list)
loaded_list.load(range(3))
print(loaded_list) 

如预期的那样产生:

[0, 1, 2, 3]
[0, 1, 2, 3, 0, 1, 2]
[0, 1, 2, 3, 0, 1, 2, 0, 1, 2]

我的困惑来自 class 方法和静态方法的区别。当创建ListWithLoadedMethod的新实例时,它是list的子class,但是当我们初始化实例时,我们将load指向list.extend; Python 如何知道 list.extend 我们并不是说 load 应该指向 list class 的 class 方法,而是实际上(貌似?)继承superclass列表的实例方法?

其实不是继承超类(列表),而是创建对list.extend方法的引用

当您检查它们的身份时,您会发现它们在内存中是相同的对象。

id(list.extend)
Out: 3102044666032

id(ListWithLoadMethod.load)
Out: 3102044666032