2017-09-05 5 views
1

Cela fait longtemps que je la recherche et que je ne trouve rien. Je suis un programmeur expérimenté, mais récemment passé en Python.Comment configurer le répertoire du module/module python et la définition de la classe pour une dénomination intuitive

En bref, je veux développer/évoluer une bibliothèque orientée objet des classes associées dans un espace de noms avec plusieurs fichiers séparés (en raison de la complexité et le désir de modularité accrue):

Actuellement, je pourrais avoir:

# file lib/NameSpace.py 

class Foo(object): 
    def __init__(self): 
     .... 

class Bar(object): 
    def __init__(self): 
     .... 

class Baz(object): 
    def __init__(self): 
     .... 

et avec ce programme peut-il faire:

import NameSpace 
a = NameSpace.Foo() 
b = NameSpace.Bar() 

maintenant, ces classes se compliquent et Foo et Bar sont functionall y différent quoique lié dans le NameSpace conceptuel, donc je veux les déplacer pour séparer les fichiers dans l'espace de noms mais sinon garder ma bibliothèque de code la même chose.

Donc, je pense que je veux une structure de fichier comme ceci:

lib/NameSpace 
lib/NameSpace/__init__.py 
lib/NameSpace/Foo.py 
lib/NameSpace/Bar.py 
lib/NameSpace/Baz.py 

Mais cela me demander de changer tout le code d'exécution pour initialiser ceux-ci comme si:

import NameSpace.Foo 
a = NameSpace.Foo.Foo() 

# ***Boo.**** Why u not like 'a = NameSpace.Foo()'? 

Alors, comment Je structure ces choses pour ne pas avoir à ajouter le nom de la classe 'Foo' au module 'Foo'? Je pourrais accomplir ceci en éditant .py initialisation d'être une usine, comme ceci:

#lib/NameSpace/__init__.py 

import NameSpace.Foo as NSF 

def Foo(*args, **kwargs): 
    return(NSF.Foo(*args,**kwargs)) 

Mais que tout semble plus inélégant que j'attends de Python. Y a-t-il une meilleure façon de le faire?

Répondre

1

Dans votre __init__.py

from .Foo import Foo 
from .Bar import Bar 
from .Baz import Baz 

nommer les fichiers différemment que vos classes empêche l'écrasement.

+0

Parfait. Merci! – Kevin

0

Par souci de simplicité, vous pouvez importer la classe Foo à partir du module comme ceci:

from NameSpace.Foo import Foo 

Après cela, vous pouvez créer un objet de Foo classe comme ceci:

a = Foo() 

Si vous comme, vous pouvez fournir un nom différent lorsque vous importez des choses aussi:

from NameSpace.Foo import Foo as F 
a = F()