2010-08-26 8 views
18

Je suis en train de mettre un tas de choses liées dans une classe. Le but principal est de les organiser dans un espace de noms.Est-ce une bonne idée d'utiliser la classe comme un espace de noms en Python?

class Direction: 

    north = 0 
    east = 1 
    south = 2 
    west = 3 

    @staticmethod 
    def turn_right(d): 
    return turn_to_the_right 

    @staticmethod 
    def turn_left(d): 
    return turn_to_the_left 



# defined a short alias because direction will be used a lot 
D = Direction 

d0 = D.north 
d1 = D.turn_right(d) 

Il n'y a pas beaucoup de concept d'objet impliqué. En C++, j'utiliserai le mot-clé de la langue réelle namespace. Il n'y a pas de telle chose dans Python. Donc j'essaie d'utiliser class à cette fin.

Est-ce une bonne idée? Un piège avec cette approche?

Je viens de répondre à une question connexe hier. Cette question est posée d'une manière différente. C'est une décision que je dois prendre pour moi-même.

Méthode statique vs fonction du module dans python - débordement de pile

Static method vs module function in python

+0

Merci. Jusqu'à présent, le commentaire que j'ai obtenu est 1. Utilisez le module 2. Faites ce qui est logique. Ce que je veux toujours comprendre est si la classe est considérée comme une option légitime pour simplement utiliser comme espace de noms ou s'il y a de bonnes raisons de ne pas le faire. –

Répondre

14

No. coller dans un module à la place. Python n'a pas d'espaces de noms de la même manière que C++, mais les modules ont un but similaire (regrouper des classes et des fonctions "similaires" et leur donner des noms uniques pour éviter les conflits).

Modifier
J'ai vu le commentaire que vous avez posté à votre question. Pour répondre plus explicitement, non, dans le code Pythonic, il n'est pas vraiment correct d'utiliser une classe pour émuler un espace de noms. Les modules sont là pour regrouper les classes, fonctions et variables associées - utilisez un module à la place. Une classe représente une «chose» qui a un comportement (méthodes) et des données (variables d'instance) - ce n'est pas seulement une collection de fonctions et de variables autonomes.

+2

Y a-t-il une justification plus forte pour le module? Je peux penser à une option pour faire 'de direction import *'. D'un autre côté, s'il n'y a que 4 constantes "nord, est, sud, ouest", il semble exagéré de les mettre dans leur propre module. –

+1

Vous devriez les mettre où ils ont un sens, d'un point de vue organisationnel. S'ils "vont ensemble" avec un module existant, placez-les là (vous pourriez les renommer en "DIRECTION_NORTH" ou autre). Sinon, placez-les dans un module séparé, si cela a du sens. – mipadi

+0

Votre raison d'utiliser une classe au lieu d'un module pour le placement de noms nie les qualités très réelles que les deux choses partagent en Python. Plus pareil que différent. – uchuugaka

2

Oui, c'est bon. Vous pouvez même utiliser property pour que les méthodes ressemblent à des attributs.

Si vous avez une grande classe, il pourrait être plus propre d'utiliser un module

2

Cela dépend de la situation; Si vous pouvez coller une constante dans le module et que cela a du sens, faites-le, mais en les mettant dans la classe peut rendre leur signification plus évidente, et permettre aux constantes similaires d'avoir plus d'abstraction: les placer dans le ServerError classe a plus de sens que de les avoir tous ajoutés avec SERVER_ERROR résidant librement dans le module.

Faites ce qui est le plus intuitif, mais essayez d'éviter la pollution des espaces de noms.

4

Oui, en effet. Vous pouvez utiliser les classes Python uniquement pour les espaces de noms car c'est l'une des choses spéciales qu'ils peuvent faire et faire différemment des modules. Il est beaucoup plus facile de définir une classe comme un espace de noms inline dans un fichier que de générer plus de fichiers. Vous ne devriez pas le faire sans commenter votre code en disant à quoi il sert. Les classes Python ont beaucoup de formes et d'objectifs différents, ce qui rend difficile la compréhension du code que vous n'avez jamais vu auparavant.

Une classe Python utilisée comme espace de noms n'est pas moins une classe Python que celle qui correspond à la perception de ce qu'est une classe dans d'autres langues. Python ne nécessite pas d'instancier une classe pour être utile. Il ne nécessite pas d'ivars et ne nécessite pas de méthodes. C'est assez flexible.

Les classes peuvent également contenir d'autres classes.

Beaucoup de gens ont leurs idées sur ce qui est ou n'est pas Pythonic. Mais s'ils étaient tous préoccupés par quelque chose comme la cohérence, ils poussent à faire des choses comme len()dir() et help() être une méthode d'objets plutôt qu'une fonction globale.

Faire ce qui fonctionne, commenter/documenter si ce n'est pas d'usage habituel.