super or not super?

Antoon Pardon antoon.pardon at vub.be
Tue Jul 16 04:02:29 EDT 2019


On 16/07/19 09:18, Chris Angelico wrote:
> On Tue, Jul 16, 2019 at 3:32 PM Ian Kelly <ian.g.kelly at gmail.com> wrote:
>> On Sun, Jul 14, 2019 at 7:14 PM Chris Angelico <rosuav at gmail.com> wrote:
>>> On Mon, Jul 15, 2019 at 10:51 AM Paulo da Silva
>>> <p_s_d_a_s_i_l_v_a_ns at netcabo.pt> wrote:
>>>> Às 15:30 de 12/07/19, Thomas Jollans escreveu:
>>>>> On 12/07/2019 16.12, Paulo da Silva wrote:
>>>>>> Hi all!
>>>>>>
>>>>>> Is there any difference between using the base class name or super to
>>>>>> call __init__ from base class?
>>>>> There is, when multiple inheritance is involved. super() can call
>>>>> different 'branches' of the inheritance tree if necessary.
>>>>> ...
>>>> Thank you Jollans. I forgot multiple inheritance. I never needed it in
>>>> python, so far.
>>>>
>>> Something to consider is that super() becomes useful even if someone
>>> else uses MI involving your class. Using super() ensures that your
>>> class will play nicely in someone else's hierarchy, not just your own.
>> Just using super() is not enough. You need to take steps if you want to
>> ensure that you class plays nicely with MI. For example, consider the
>> following:
>>
>> class C1:
>>     def __init__(self, name):
>>         self._name = name
>>
>> class C2(C1):
>>     def __init__(self, name, value):
>>         super().__init__(name)
>>         self._value = value
>>
>> This usage of super is just fine for the single-inheritance shown here. But
>> there are two reasons why this cannot be neatly pulled into an MI
>> hierarchy. Can you spot both of them?
> Well, obviously it's violating LSP by changing the signature of
> __init__, which means that you have to be aware of its position in the
> hierarchy. If you want things to move around smoothly, you HAVE to
> maintain a constant signature (which might mean using *args and/or
> **kwargs cooperatively).

I guess the second problem is that C1 doesn't call super. Meaning that if
someone else uses this in a multiple heritance scheme, and the MRO reaches
C1, the call doesn't get propagated to the rest.

-- 
Antoon Pardon




More information about the Python-list mailing list