2014-01-17 2 views
-1

Я работаю над проектом, который требует, чтобы я создал несколько классов и подклассов в одном файле и использовал их во втором файле. Я хотел бы спросить, как Python обрабатывает импорт первого файла во второй.Как Python обрабатывает импортированные подклассы?

Например, если у меня есть файл my_classes.py:

class Myclass(object): 
    pass 

class Mysubclass(myclass): 
    pass 

будет с помощью следующего кода работы:

from my_classes import Myclass 

print Mysubclass 

(где команда print просто пример использования Mysubclass) , или мне нужно импортировать Mysubclass явно?

Заранее благодарен!

+1

Почему бы не попробовать этот код и посмотреть, есть ли ошибка? – zhangxaochen

+0

Похоже на очевидное решение и действительно отвечает на мой вопрос. Однако мне хотелось бы получить некоторую справочную информацию о том, почему Python ведет себя так, как это делает (например, почему подклассы не загружаются автоматически при вводе класса). – LSchoon

ответ

0

Это не сработает. Оператор Python import не заботится о подклассах. На самом деле, это ничего не значит. Он делает именно то, что вы говорите. «Явный лучше, чем неявный» - популярная фраза в кругах Python.

Здесь:

from my_classes import Myclass 

Вы сказали Python импортировать только Myclass.

Это будет импортировать оба класса:

from my_classes import Myclass, Mysubclass 

Вы можете прочитать, как Python import работает here.

+0

Спасибо! Ссылка, которую вы указали, немного отличается от моего понимания, но отвечает на вопрос, который у меня был. – LSchoon

0

Ваш подкласс не будет доступен, если вы сделаете это так. Вы должны импортировать каждый объект отдельно.

Вот быстрый пример

test_class.py класс MyClass (объект): Защиту INIT (Я): печать самостоятельно. класс

test_class_import.py из test_class импорта MyClass

MyClass() 
MySubClass() 

##output## 
<class 'test_class.MyClass'> 
Traceback (most recent call last): 
    File "test_class2.py", line 4, in <module> 
    MySubClass() 
NameError: name 'MySubClass' is not defined 

но

from test_class import MyClass, MySubClass 
MyClass() 
MySubClass() 

##output## 
<class 'test_class.MyClass'> 
<class 'test_class.MySubClass'> 
0

Каждый модуль имеет пространство имен.

Пространство имен - это отображение из имен переменных в значения (объекты Python).

Заявление

import my_classes 

делает my_classes имен доступным из текущего модуля, помещая имя переменной my_classes в пространстве имен текущего модуля.Вы можете получить доступ к значениям из my_classes с синтаксисом

my_classes.variable 

Так, например:

import my_classes 
print my_classes.Mysubclass 
print my_classes.MyClass 

Если это слишком много печатать, я предлагаю

import my_classes as MC 
print MC.Mysubclass 
print MC.MyClass 

вы также можете сделать

from my_classes import Mysubclass, MyClass 

, но этот форма импорта discouraged by some Python experts.

from my_classes import Mysubclass, MyClass 

загружает весь модуль my_class но только местами имена переменных Mysubclass и MyClass в пространстве имен текущего модуля. Они указывают на те же значения, что и переменные с тем же именем в пространстве имен my_classes. Вы не получаете доступ к чему-либо еще из пространства имен модуля my_class.

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