使用超类方法作为实例方法
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
我目前正在阅读 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
。我们可以通过写
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