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

Python 使用超类方法作为实例方法,python,inheritance,class-method,instance-methods,Python,Inheritance,Class Method,Instance Methods,我目前正在阅读卢西亚诺·拉马略的优秀著作。在关于接口和继承的一章中,我们构建了一个列表的子类(参见原始代码),我对我们定义一个实例方法的方式感到困惑。对于一个简单的例子,我的困惑是由以下情况引起的: class ListWithLoadMethod(list): load = list.extend 它生成一个新的list子类,该子类的extend方法别名为load。我们可以通过写作来测试这门课 loaded_list = ListWithLoadMethod(range(4)) pr

我目前正在阅读卢西亚诺·拉马略的优秀著作。在关于接口和继承的一章中,我们构建了一个列表的子类(参见原始代码),我对我们定义一个实例方法的方式感到困惑。对于一个简单的例子,我的困惑是由以下情况引起的:

class ListWithLoadMethod(list):
    load = list.extend
它生成一个新的list子类,该子类的
extend
方法别名为
load
。我们可以通过写作来测试这门课

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]

我的困惑源于类方法和静态方法的区别。创建
列表WithLoadedMethod
的新实例时,它是
列表
的子类,但初始化实例时,我们将
加载
指向
列表。扩展
;Python如何知道,通过
list.extend
我们并不意味着
load
应该指向
list
类的类方法,而是实际(显然?)继承超类列表的实例方法?

它实际上不是从超类(list)继承的,但是创建对
列表的引用。扩展
方法

当您检查它们的身份时,您将看到它们是内存中相同的对象

id(list.extend)
Out: 3102044666032

id(ListWithLoadMethod.load)
Out: 3102044666032

谢谢从现在起,我必须记住id函数^^^,如果您不介意的话,可以扩展我的问题:ListWithLoadMethod的实例调用list.extend时会发生什么?list.extend(iterable)在使用时是否真的看起来像list.extend(self,iterable)或什么?当您在ListWithLoadMethod实例上调用list.extend时,会发生以下情况:1)l_obj=ListWithLoadMethod()2)ListWithLoadMethod.extend(l_obj,iterable)。因此,它的工作原理与其他类方法类似,再次感谢!你帮了大忙。