Каков прецедент для метода __new__ для возврата объекта другого типа, чем его первый аргумент?

Документация подразумевает, что для __new__(cls, ...) это нормально __new__(cls, ...) чтобы возвращать объект типа, отличного от cls . В этом случае __init__() не будет вызываться. Это не указано явно, но здравый смысл или простой тест подтверждает, что в результате объект не будет иметь тип cls .

Почему это, казалось бы, странное поведение допустимо? Какой прецедент? Это явно преднамеренно.

2 Solutions collect form web for “Каков прецедент для метода __new__ для возврата объекта другого типа, чем его первый аргумент?”

Это может быть полезно при создании макетных объектов для модульного тестирования.

Вы можете изменить метод __new__ чтобы вернуть в определенных случаях другой объект с тем же интерфейсом, что и оригинал (например, имитируя поведение экземпляров исходного класса), без изменений остальной части кода.

Я думаю, что люди Python просто решили, что нет причин принуждать __new__(cls, ...) возвращать экземпляры cls . __new__ – довольно продвинутый метод, поэтому пользователь, вероятно, знает, что делает, и могут быть некоторые причины использовать это поведение.

Тем не менее, они все равно должны сделать чек. Во время создания экземпляра следует вызывать __init__ . Это разумно, если экземпляр (возвращаемый с __new__ ) действительно является cls . Если __new__ возвращает что-то другое, есть вероятность, что объект не сможет обработать аргументы, которые будут переданы __init__ .

В итоге добавление __new__ к языку оставило разработчикам три варианта:

  1. Enforce __new__(cls, ...) чтобы вернуть экземпляр cls
  2. Всегда вызывайте __init__ в экземпляре, возвращаемом __new__ , оставляя его пользователю, чтобы гарантировать, что объект может обрабатывать аргументы.
  3. __init__ только __init__ если экземпляр действительно является экземпляром cls .

Я думаю, что вариант 3 казался наиболее практичным.

  • AttributeError: объект 'property' не имеет атрибута
  • Создание классов с множеством импортных функций здесь и там
  • class Classname (object), какое слово является «объектом» в Python?
  • Получение имени экземпляра внутри класса __init __ ()
  • Python проверяет экземпляры классов
  • минимальная куча в python
  • Почему Python не вызывает метод экземпляра __init __ () при создании экземпляра, но вызывает вместо него класс __init __ ()?
  • Как клонировать объект генератора Python?
  • Как сделать копию двумерного массива в Python?
  • Путаница о том, как numpy применяется вдоль оси и понимает список
  • Python: как передать аргумент по умолчанию методу экземпляра с переменной экземпляра?
  •  
    Interesting Posts for Van-Lav

    Как получить список переменных в определенном модуле Python?

    Файл как аргумент командной строки для argparse – сообщение об ошибке, если аргумент недействителен

    Как запустить скрипт python на терминале (ubuntu)?

    Как кэшировать в IPython Notebook?

    Поле модели Django по умолчанию основано на другом поле в той же модели

    Как прекратить получение ImportError: не удалось импортировать настройки «mofin.settings» при использовании django с wsgi?

    Являются ли интерфейсы просто «синтаксическим сахаром»?

    Создайте новую obj с функцией deepcopy, но с новой переменной share obj со старым obj

    Где я могу найти подходящие примеры конвенций PEP 257 Docstring?

    добавление xml-контента в сфикс-сгенерированный документ

    Когда и почему я могу назначить экземпляр класса дескриптора атрибуту класса в Python, а не использовать свойство?

    Python Tornado – отключить ведение журнала до stderr

    Как загрузить файл на Google Диск с помощью скрипта Python?

    Любимые советы и возможности Django?

    Почему «pip install» внутри Python поднимает SyntaxError?

    Python - лучший язык программирования в мире.