Почему простой импорт модуля python выполняет все, что присутствует в этом модуле? [дубликат]
На этот вопрос уже есть ответ здесь:
Почему это Python работает мой модуль, когда я импортировать его, и как мне его остановить?
9 ответов
Недавно я заметил, что использование модулей было хорошим вариантом для поддержания моего программирования на python в чистоте.
Для начала работы я сделал один модуль (с именем, oop.py) с одним классом в нем, который выглядит как ниже:
#Module named oop
class Team:
def __init__(self):
print "class Team initialized"
def displayTeam(self):
print "Team name: ", self.name, ",Rank :" , self.rank
def setTeam(self,name,rank):
self.name = name
self.rank = rank
t1 = Team()
t1.setTeam("Man-Utd", 1)
t1.displayTeam()
Согласно документации python, если мы хотим использовать определенный атрибут из модуля, то мы используем <from module_name> import <attribute>. Я хотел только загрузить "команду класса"
В другом коде python (с именем, oop1.py) я просто импортировал вышеупомянутый модуль. oop.py это, как указано ниже:
#This is oop1.py.
#Importing module oop
from oop import Team
Выход python oop1.py из терминала был :
class Team initialized
Team name: Man-Utd ,Rank : 1
Объявив from oop import Team, я ожидал загрузить только определение класса. Почему эти дополнительные строки t1 = Team() из oop.py нас казнят ?
t1.setTeam("Man-Utd", 1)
t1.displayTeam()
Разве инициализация не разрешена в модулях ?
Что мне делать, если я хочу только структуру класса команды, а не другие вещи модуля ?
Предупредите меня, если я где-то ошибаюсь.
3 ответов:
В pythonмодулями являются объекты . Для создания объекта модуля код, который он содержит, выполняется и найденные привязки добавляются к объекту в качестве атрибутов.
Указание того, что вы хотите импортировать, не меняет того факта, что выполняется весь модуль и после этого только эта единственная привязка помещается в область
import.Это стандартная практика, чтобы поместить любой код, который вы делаете Не хотите выполнить при импорте после охранника:
if __name__ == '__main__': # your code here
__name__является специальным глобальным, который является__main__только при выполнении модуля. Во время импорта ему присваивается имя модуля (и при этом тот код не будет выполняться).
Чтобы узнать больше о модулях, прочитайте документацию . Существует также раздел, который объясняет вышеупомянутый guard: выполнение модулей в виде скриптов
Да, код каждого импортируемого модуля будет выполняться на начальном
import. (Поскольку Python является интерпретируемым языком, это ожидаемое поведение.)Если есть части модуля, которые вы не хотите запускать при импорте, только когда файл запускается напрямую, сделайте
if __name__ == "__main__": t1 = Team() t1.setTeam("Man-Utd", 1) t1.displayTeam()
class Team: def __init__(self): print "class Team initialized" def displayTeam(self): print "Team name: ", self.name, ",Rank :" , self.rank def setTeam(self,name,rank): self.name = name self.rank = rank if __name__ =='__main__': # use if __name__ =='__main__':, then lines will not be executed when you import. t1 = Team() t1.setTeam("Man-Utd", 1) t1.displayTeam()
Comments