Типичные реализации создают новый экземпляр класса, вызывая
__new__()
метод суперкласса, используяsuper(currentclass, cls).__new__(cls[, ...])
с соответствующими аргументами, а затем при необходимости изменяя вновь созданный экземпляр перед его возвратом.
...Если
__new__
не возвращает экземпляр cls, метод__init__()
нового экземпляра не будет вызван.
простейшая реализация __new__
:
class MyClass:
def __new__(cls):
RetVal = super(currentclass, cls).__new__(cls)
return RetVal
Как именно super(currentclass, cls).__new__(cls[, ...])
возвращает объект типа cls
?
Этот оператор вызывает object.__new__(cls)
, где cls
- MyClass
.
Итак, как класс object
узнает, как создать тип MyClass
?
cls
. - person user2357112 supports Monica   schedule 29.07.2016cls
. Какsuper(currentclass, cls).__new__(cls)
возвращаетcls
? Вы говорите, что он неявно его отбрасывает? - person Bob   schedule 29.07.2016object.__new__
смотрит наcls
параметр, который вы ему передали, и говорит: "Ну и дела, я полагаю, Адриан хочет объект типаcls
". Я должен сделать один из них. - person user2357112 supports Monica   schedule 29.07.2016super(class1, class2)
; какая там логика? Он получает базовый класс, общий для обоих классов, что ли? - person Bob   schedule 29.07.2016object.__new__
возвращает новую структуру C, которая ссылается на объект класса. Все это делается на C. Это то, что вы ищете? - person Martijn Pieters   schedule 29.07.2016object.__new__
ответ абсолютно логичен, и да, это то, что я ищу. Я также хотел бы знать синтаксисsuper
. В документе вsuper(class1, class2)
говорится, чтоissubclass(class2, class1)
должно быть истинным. OK. Но как тогдаsuper
использовать ОБЕИХ классов, чтобы вернуть то, что он возвращает? - person Bob   schedule 29.07.2016super()
, которые охватывают это и многое другое. - person Martijn Pieters   schedule 29.07.2016__class__
определяет это. Также см. Почему в Python 3.x есть волшебство super ()? - person Martijn Pieters   schedule 29.07.2016