2009-02-18 3 views
2

Я смущен, что имя каталога, имя файла и имя класса все работают вместе.python Имя файла класса модуля MySQL

Это то, что я в данный момент

app.py 
    database/ 
    client.py 
    staff.py 
    order.py 

Внутри client.py У меня есть один класс под названием client, который выступает в качестве модели базы данных (MVC). То же самое с моими другими файлами: staff.py имеет класс под названием staff, order.py имеет order.

Тогда в app.py я:

from database import client as model 
    c = model.client() 

И тогда я запутаться. В идеальном мире это то, что я хочу сделать:

  1. Держи мои классы модели базы данных в отдельных файлах в их собственном каталоге.

  2. Используйте их, как это:

c = model.client() 
    o = model.order() 
    s = model.staff() 

Единственный способ, которым я могу видеть, чтобы сделать это, чтобы положить все свои классы в одном файле с именем model.py и сохранить это в корне.

Уверен, что здесь отсутствует что-то очень основное.

+0

Так я прав, что ваша проблема в том, что вы иметь класс с именем X в файле с именем X и всеми этими файлами в пакете Y, и вы хотите просто сказать YX() (и тем самым сохранить одно упоминание о X)? – MrTopf

+0

Я не знаю - у меня нет ни X, ни Y;) –

ответ

4

У Python есть два основных способа импорта содержимого. Модули и пакеты.


модуль просто питон файл по пути включают: order.py

Если order.py определяет класс с именем Foo, то доступ к этому классу можно было путем:

import order 
o = order.foo() 

для того, чтобы использовать синтаксис из orignial вопрос, вам нужно будет убедиться, что ваш model.py файл имеет следующий атрибуты: [клиент, штат, заказ]

Однако это обычно означает размещение их в одном файле. Это то, чего вы пытаетесь избежать.


Пакет представляет собой каталог с __init__.py внутри него. init .py инициализирует пакет (то есть он запускается при первом импорте), и вы можете иметь либо модули, либо подпакеты в этом каталоге.

model 
    __init__.py 
    client.py 
    staff.py 
    order.py 

Таким образом, чтобы получить доступ к любому из вспомогательных модулей, вы бы просто сказать:

import model.client 

Однако, это просто импортировать модуль.Он не импортирует ни одного из атрибутов модуля. Поэтому для того, чтобы получить доступ к классу внутри модуля, вам необходимо будет указать его:

import model.client 
o = model.client.clientclass() 

Это немного утомительно, но очень хорошо организовано.


Лучший из обоих (где производительность не имеет большого значения):

Если вы вводите следующий код в __init__.py:

from .client import clientclass as client 
from .staff import staffclass as staff 
from .order import orderclass as order 

Тогда у вас есть автоматически загружаются все ваши классы, и к ним можно получить доступ:

import model 
c = model.client() 
s = model.staff() 
o = model.order() 

В конце концов, это может быть более просто придерживаться не-магическим образом, чтобы сделать это:

import model.client 
o = model.client.clientclass() 

--Gahooa

+0

Хороший ответ. Почему снижение производительности? –

+0

другой вопрос: делает вербальный способ [o = model.client.clientclass()] утечка информации о реализации в код? Скажем, во время рефакторинга вы решили переместить класс (например, клиентский класс) в свой собственный файл, вам нужно изменить сотни строк, в которых вы создаете новый клиентский класс. (У меня нет символов ..) –

+0

@ monk.e.boy: производительность снижается, потому что все файлы импортируются, даже если вам нужен только один. Если это длительный процесс или простая программа, никаких проблем. Но если его нужно много загружать, это может повлиять. – gahooa