Search code examples
pythoninheritanceclass-methodinstance-methods

Using superclass methods as instance methods


I am currently reading through Luciano Ramalho's excellent book Fluent Python. In a chapter about interfaces and inheritance we build a subclass of a list (see github for the original code) and I am confused about the way we define one of the instance methods. For a simlified example my confusion is caused by a situation as follows:

class ListWithLoadMethod(list):
    load = list.extend

which generates a new subclass of list which has an alias for the extend method as load. We can test the class by writing

loaded_list = ListWithLoadMethod(range(4))
print(loaded_list)
loaded_list.extend(range(3))
print(loaded_list)
loaded_list.load(range(3))
print(loaded_list) 

which produces, as expected:

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

My confusion arises from on the difference of class methods and static methods. When the new instance of ListWithLoadedMethod is created, it is a subclass of list, but when we initialize the instance we point load to list.extend; how does Python know that by list.extend we do not mean that load should point to a class method of the list class but to actually (apparently?) inherit the instance method of the superclass list?


Solution

  • It's actually not inheriting from superclass (list), but creating reference to list.extend method

    When you inspect their identity, you will see that they are same objects in memory.

    id(list.extend)
    Out: 3102044666032
    
    id(ListWithLoadMethod.load)
    Out: 3102044666032