2009-02-18 9 views
2

Je ne comprends pas comment le nom du répertoire, le nom du fichier et le nom de la classe fonctionnent tous ensemble.python Nom du fichier de la classe du module MySQL

C'est ce que je au moment

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

intérieur client.py J'ai une seule classe appelée client, qui agit comme le modèle de base de données (MVC). La même chose avec mes autres fichiers: staff.py a une classe appelée staff, order.py a order.

Puis, en app.py je fais:

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

Et puis-je obtenir confus. Dans un monde idéal ce que je veux faire:

  1. Observe mes classes de modèle de base de données dans des fichiers séparés dans leur propre répertoire.

  2. Utilisez-les comme ceci:

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

La seule façon que je peux voir de le faire est de mettre toutes mes classes dans un seul fichier appelé model.py et enregistrer ce à la racine.

Je suis sûr qu'il me manque quelque chose de très basique ici.

+0

suis-je raison que votre problème est que vous avoir une classe avec le nom X dans un fichier avec le nom X et tous ces fichiers dans un paquet appelé Y et vous voulez simplement dire YX() (et donc enregistrer une mention de X)? – MrTopf

+0

Je ne sais pas - je n'ai ni X ni Y;) –

Répondre

4

Python propose deux méthodes d'importation de contenu. Modules et paquets.


Un module est simplement un fichier python sur le chemin d'inclusion: order.py

Si order.py définit une classe nommée foo, l'accès à cette classe pourrait être fait par:

import order 
o = order.foo() 

pour utiliser la syntaxe de la question orignial, vous devez vous assurer que votre fichier model.py les éléments suivants sont attributs: [client, personnel, commande]

Cependant, cela signifie généralement les placer dans un seul fichier. C'est ce que vous essayez d'éviter.


Un paquet est un annuaire avec un __init__.py à l'intérieur de celui-ci. Le init .py initialise le package (c'est-à-dire qu'il est exécuté à la première importation) et vous pouvez avoir des modules ou des sous-packages dans ce répertoire.

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

De cette façon, d'accéder à l'un des sous-modules, vous simplement dire:

import model.client 

Cependant, ce qui est simplement importation du module.Il n'importe aucun des attributs du module. Ainsi, afin d'accéder à une classe à l'intérieur du module, vous devez spécifier:

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

C'est un peu fastidieux, mais très bien organisé.


meilleur des deux (où la performance est pas une grosse affaire):

Si vous tapez le code suivant dans __init__.py:

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

Ensuite, vous avez auto-chargé toutes vos classes, et ils peuvent être consultés comme:

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

En fin de compte, il peut être plus simple à coller avec la manière non-magique pour le faire: Alors

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

--Gahooa

+0

Bonne réponse. Pourquoi la performance serait-elle réduite? –

+0

une autre question: est-ce que la manière verbeuse [o = model.client.clientclass()] fuit les détails d'implémentation dans le code? Supposons que lors du refactoring, vous décidiez de déplacer une classe (par exemple clientclass) dans son propre fichier, vous devez modifier les centaines de lignes dans lesquelles vous créez une nouvelle classe client. (Je n'ai plus de caractères ..) –

+0

@ monk.e.boy: Les performances sont réduites car tous les fichiers sont importés même si vous n'en avez besoin que d'un seul. Si c'est un processus de longue durée, ou un programme simple, pas de problème. Mais s'il faut beaucoup charger, cela peut avoir un impact. – gahooa

Questions connexes