Почему супер .__ new__ не нужен аргумент, а экземпляр .__ new__ нужен? - PullRequest
0 голосов
/ 06 марта 2019

Пытается понять super и __new__

Вот мой код:

class Base(object):
    def __new__(cls,foo):
        if cls is Base:
            if foo == 1:
                #  return Base.__new__(Child) complains not enough arguments
                return Base.__new__(Child,foo)
            if foo == 2:
                # how does this work without giving foo?
                return super(Base,cls).__new__(Child)  
        else:
            return super(Base,cls).__new__(cls,foo)

    def __init__(self,foo):
        pass 
class Child(Base):
    def __init__(self,foo):
        Base.__init__(self,foo)    
a = Base(1)  # returns instance of class Child
b = Base(2)  # returns instance of class Child
c = Base(3)  # returns instance of class Base
d = Child(1)  # returns instance of class Child

Почему super.__new__ не нужен аргумент, а __new__ нужен?

Python: 2.7.11

1 Ответ

1 голос
/ 06 марта 2019

super().__new__ - не та же функция, что и Base.__new__. super().__new__ - это object.__new__. object.__new__ не требует аргумента foo, но Base.__new__ требует.

>>> Base.__new__
<function Base.__new__ at 0x000002243340A730>
>>> super(Base, Base).__new__
<built-in method __new__ of type object at 0x00007FF87AD89EC0>
>>> object.__new__
<built-in method __new__ of type object at 0x00007FF87AD89EC0>

Что может вас смущать, так это строка:

return super(Base,cls).__new__(cls, foo)

Это вызывает object.__new__(cls, foo). Это верно, он передает аргумент foo в object.__new__, хотя object.__new__ это не нужно. Это разрешено в python 2, но может привести к сбою в python 3. Было бы лучше удалить оттуда аргумент foo.

...