Which of the 4 ways to call super() in Python 3 to use?

后端 未结 2 1196
栀梦
栀梦 2020-12-05 14:17

I wonder when to use what flavour of Python 3 super().

Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class_         


        
相关标签:
2条回答
  • 2020-12-05 14:52

    Let's use the following classes for demonstration:

    class A(object):
        def m(self):
            print('m')
    
    class B(A): pass
    

    Unbound super object doesn't dispatch attribute access to class, you have to use descriptor protocol:

    >>> super(B).m
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'super' object has no attribute 'm'
    >>> super(B).__get__(B(), B)
    <super: <class 'B'>, <B object>>
    

    super object bound to instance gives bound methods:

    >>> super(B, B()).m
    <bound method B.m of <__main__.B object at 0xb765dacc>>
    >>> super(B, B()).m()
    m
    

    super object bound to class gives function (unbound methods in terms of Python 2):

    >>> super(B, B).m
    <function m at 0xb761482c>
    >>> super(B, B).m()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: m() takes exactly 1 positional argument (0 given)
    >>> super(B, B).m(B())
    m
    

    See Michele Simionato's "Things to Know About Python Super" blog posts series (1, 2, 3) for more information

    0 讨论(0)
  • 2020-12-05 15:12

    A quick note, the new usage of super is outlined in PEP3135 New Super which was implemented in python 3.0. Of particular relevance;

    super().foo(1, 2)
    

    to replace the old:

    super(Foo, self).foo(1, 2)
    
    0 讨论(0)
提交回复
热议问题