Почему простой импорт модуля python выполняет все, что присутствует в этом модуле? [дубликат]



На этот вопрос уже есть ответ здесь:



Недавно я заметил, что использование модулей было хорошим вариантом для поддержания моего программирования на 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()
t1.setTeam("Man-Utd", 1)
t1.displayTeam()
из oop.py нас казнят ?



Разве инициализация не разрешена в модулях ?
Что мне делать, если я хочу только структуру класса команды, а не другие вещи модуля ?
Предупредите меня, если я где-то ошибаюсь.

587   3  

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

    Ничего не найдено.