Я знаю, что когда модуль или даже если конкретный объект в , что модуль импортируется - from foo import bar
- что весь модуль оценивается первым. Но мне было просто любопытно, что если мы определим __init__
или __new__
внутри этого модуля, у него будет особый смысл или обработка, как это делается в классе и ? И почему так?__init__, __new__ и т.д. определены в модуле
ответ
№ Нет. Класс модуля, а модули являются экземплярами этого класса, но он является внутренним для Python. Определение магических методов в модуле не добавит их в класс модуля, и они не будут делать ничего особенного во время импорта.
Это немного вводит в заблуждение. Ключевым моментом здесь является то, что глобальные функции в модуле не являются методами объекта модуля. Если вы _do_ определите методы '__init__' и' __new__' в классе модуля (или, вернее, в подклассе, который вы импортируете или подключаете к нему), они будут работать. – abarnert
то почему пакеты обрабатываются по-разному? Ссылаясь на '__init __. Py' –
@ hus787: к ним не относятся по-разному. Кто сказал, что они были? – abarnert
Вводя это свободно, модули не имеют методов.
Более строго каждый модуль представляет собой экземпляр некоторого класса, обычно builtins.module
(хотя вы можете заменить его на крючок импорта или путем monkeypatching), и этот класс, конечно, имеет методы. Но глобальные функции модуля не являются методами объекта модуля.
Вы можете проверить это довольно легко, просто распечатав type(foo.func)
. Это функция, а не связанный метод экземпляра foo
.
Кроме того, даже если модуль глобальных функций были методов экземпляра, что не имеет никакого значения, потому что __init__
проверяются в классе словаре , не экземпляра словаря. Если вы думаете об этом, нет никакого способа, которым это могло бы быть иначе, потому что у вас нет есть экземпляр словарь для проверки до __init__
возвращается. Таким образом, это может работать только в том случае, если каждый модуль является объектом класса (и экземпляр type
), которого они явно не являются.
Ваша путаница с __init__.py
является отвлекающим маневром. Файлы - это не функции, а тем более методы, и ни файлы, ни модули не могут быть вызваны.
Если вы хотите, строгие определения: классы и модули, определенные here. Как вы можете видеть, метод __new__
- это функция, характерная для классов. Его поведение определено here. Обратите внимание, что __init__
фактически вызван как результат object.__new__
, поэтому он не определен даже для классов, но он определенно не определен ни для чего другого.
Между тем, __init__.py
определено here. (Обратите внимание, что с Python 3.2 это просто соглашение, используемое импортерами по умолчанию для обычных пакетов, а не собственно самим языком.)
Эти две функции не имеют ничего общего, кроме наименований и некоторых неопределенных сходств. Возможно, именование было ошибкой, но я думаю, что больше людей получают полезные интуиции из именования, чем путают. (Во всяком случае, поскольку он возвращается к модулю ni
для Python 1.3, я сомневаюсь, что он будет изменен в ближайшее время.)
Я думаю, что вы могли бы сделать класс, который имел __init__()
и/или __new__()
методы модуля, как делать что-то подобное тому, что делается в моем ответе на вопрос несвязанной Can I prevent modifying an object in Python?
- 1. Перекрытие __new__ и __init__ в Python
- 2. python2 и Python3: __init__ и __new__
- 3. Заменить __init__ созданного объекта в конструкторе __new__
- 4. Python: переопределить __init__ арг в __new__
- 5. Использование __new__ для переопределения __init__ в подклассе
- 6. Почему sympy переопределяет `__new__` вместо` __init__`?
- 7. Избегайте дорогостоящего __init__ хорошей причины использовать __new__?
- 8. Почему __init__ не вызывается после __new__ ИНОГДА
- 9. Python: всегда используйте __new__ вместо __init__?
- 10. Почему Fraction использует __new__ вместо __init__?
- 11. Разница между __new__ и __init__ order в Python2/3
- 12. Почему именно «__new__» и «__init__» все в классе
- 13. Почему не просто __new__, а не __new__ и __init__ в python?
- 14. Python (Python и C API): __new__ против __init__
- 15. Изменение arg в __new__ не переносится на __init__
- 16. Атрибуты Python mock определены и установлены в пределах __init__
- 17. Переопределить __init__ для всех классов в модуле
- 18. Python __enter__/__exit__ против __init__ (или __new__)/__del__
- 19. методы Динамически добавляющие с метаклассом «__init__» против «__new__»
- 20. Где находится документация Python для специальных методов? (__init__, __new__, __len__, ...)
- 21. Использование __new__ в python
- 22. украшая класс с классом обертку и __new__
- 23. Python множественное наследование __new__ и __init__ со строкой и вторым классом
- 24. странное поведение __new__ в python
- 25. Переопределить __new__ сомнения
- 26. что делает `супер()` в `__new__`
- 27. Python __new__ без вызова другой версии класса __new__?
- 28. Тип Ошибка: разницы __new__ и _new_
- 29. __init__ несоответствие спор между супер и подкласса
- 30. Почему __new__ и __init__, похоже, ведут себя по-другому, когда наносят удар по суперклассу?
'' __init__' и __new__' функции не имеют никакого значения внутри пакета. – abarnert
@abarnert хорошо у нас есть '__init__.py' –
Да, но это не функция или метод. – abarnert