2013-05-28 3 views
-4

Я знаю, что когда модуль или даже если конкретный объект в , что модуль импортируется - from foo import bar - что весь модуль оценивается первым. Но мне было просто любопытно, что если мы определим __init__ или __new__ внутри этого модуля, у него будет особый смысл или обработка, как это делается в классе и ? И почему так?__init__, __new__ и т.д. определены в модуле

+0

'' __init__' и __new__' функции не имеют никакого значения внутри пакета. – abarnert

+0

@abarnert хорошо у нас есть '__init__.py' –

+1

Да, но это не функция или метод. – abarnert

ответ

2

№ Нет. Класс модуля, а модули являются экземплярами этого класса, но он является внутренним для Python. Определение магических методов в модуле не добавит их в класс модуля, и они не будут делать ничего особенного во время импорта.

+0

Это немного вводит в заблуждение. Ключевым моментом здесь является то, что глобальные функции в модуле не являются методами объекта модуля. Если вы _do_ определите методы '__init__' и' __new__' в классе модуля (или, вернее, в подклассе, который вы импортируете или подключаете к нему), они будут работать. – abarnert

+0

то почему пакеты обрабатываются по-разному? Ссылаясь на '__init __. Py' –

+0

@ hus787: к ним не относятся по-разному. Кто сказал, что они были? – abarnert

2

Вводя это свободно, модули не имеют методов.

Более строго каждый модуль представляет собой экземпляр некоторого класса, обычно 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, я сомневаюсь, что он будет изменен в ближайшее время.)

0

Я думаю, что вы могли бы сделать класс, который имел __init__() и/или __new__() методы модуля, как делать что-то подобное тому, что делается в моем ответе на вопрос несвязанной Can I prevent modifying an object in Python?

Смежные вопросы