2015-03-31 4 views
3

У меня есть следующая структура каталогов:Python модули против классов

ican/ 
    __init__.py 
    haz/ 
    __init__.py 
    apple.py 
    grape/ 
     __init.py 
     grape.py 

apple.py где и grape.py есть определения фруктов класса. В другом тестовом файле я пытаюсь загрузить класс фруктов через что-то вроде myapple = ican.haz.apple() или mygrape = ican.haz.grape().

Какая структура каталогов и структура import для загрузки этого класса? Я также пробовал что-то вроде import ican.haz as icanhaz, а затем звонил myapple = icanhaz.apple(). Я хочу поставить все свои классы в одно и то же место и загрузить их через что-то вроде ican.haz.<class>.

+0

Это думает стоит отметить, что в Python вы не обязаны помещать каждый класс в свой собственный модуль (например, вы, как правило, в Java, например). Если ваши классы «Apple» и «Grape» достаточно просты, вы можете поместить их код в один и тот же файл (возможно, 'ican/has.py'), позволяя вам избавиться от множества ваших подпакетов. – Blckknght

ответ

0

Для того, чтобы быть однородным, либо

а) apple.py должен быть один уровень ниже в apple папке с init или

б) grape.py должно быть на один уровень выше, а не в своей собственной grape папке.

Тогда ваш импорт будет from ican.haz.apple import Apple и from ican.haz.grape import Grape (для опции a); или from ican.haz import apple, grape (для варианта b).

Чтобы получить структуру, которую вы хотите, пойти с опцией б и модифицировать init под haz.

haz/__init__.py:

from .apple import Apple 
from .grape import Grape 

__all__ = ['Apple', 'Grape'] 

И вы бы импортировать его как import ican.haz.* (считается плохим стилем, хотя). И это ~ мутация модуля vs имя класса ~ (не больше, так как исправлены имена классов). Лучше использовать одну из строк ниже с опциями a или b.

Btw, импорт в соответствии с текущей структурой должны были бы быть:

from ican.haz import apple 
from ican.haz.grape import Grape 

a = apple.Apple() 
g = Grape() 
+0

Я получаю объект 'TypeError: 'module' не вызываемый', когда я пытаюсь импортировать' apple' таким образом. Однако, если я использую 'из ican.haz.apple import apple как Apple', тогда я могу создать' a = Apple() '. Почему это работает, но ваш путь нет? – drjrm3

+0

Потому что ваш класс 'Apple' находится в файле (модуле)' apple'. ~ Будет обновлен мой ответ для корректности регистра. ~ После нескольких изменений, ввод кода и уценок на телефоне не так просто. – aneroid

1

Вы путаете два понятия. Python «module» - это файл, содержащий код Python, который можно импортировать. «Класс» python - это то, что можно определить в модуле. В данном примере apple и grape являются модулями. Вы не можете вызывать модуль, делая что-то вроде apple(), это запрещено. Вам нужно будет импортировать класс, содержащийся в модуле.

Так сказать apple.py имеет класс GetApple, определенный в нем. Так apple.py выглядел следующим образом:

class GetApple(object): 
    def __init__(self): 
     print("I have an apple!") 

Модули могут также иметь функции, так что вы могли бы иметь GetApple функцию вместо:

def GetApple(): 
    print("I have an apple!") 

модули также могут иметь переменные. Они могут иметь любое количество переменных, классов и функций. Вы можете импортировать их отдельно (например, с помощью from apple import GetApple или импортировать модуль и получить к ним доступ из модуля import apple.Но вы не можете импортировать, а затем вызывать модуль (по крайней мере, не разумным образом), а только функции или классы внутри него.

Для структуры каталогов, вы можете затем запустить его с помощью любого из этих подходов:

>>> from ican.haz.apple import GetApple 
>>> GetApple() 
I have an apple! 

>>> from ican.haz import apple 
>>> apple.GetApple() 
I have an apple! 

>>> import ican.haz.apple 
>>> ican.haz.apple.GetApple() 
I have an apple! 

И, в зависимости от ваших __init__.py файлов, возможно, также:

>>> import ican.haz 
>>> ican.haz.apple.GetApple() 
I have an apple! 

>>> import ican 
>>> ican.haz.apple.GetApple() 
I have an apple! 

Для grape.py, предполагая соответствующий класс, такого рода вещи будут работать:

>>> from ican.haz.grape.grape import GetGrape 
>>> GetGrape() 
I have a grape!