2 votes

Besoin d'une explication sur les packages et modules Python

Je suis en train d'écrire mon premier script python et cette histoire de package/module me rend fou. Commençons par la structure de mon dossier

builder.py
-buildModule\__init__.py
-buildModule\AppList.py
-buildModule\BuildClass.py
-buildModule\ConfigSystem.py
-buildModule\MenuSystem.py
-buildModule\Singleton.py

d'accord, donc mon __init__.py ressemble à ça

from ConfigSystem import *
from BuildClass import *
from MenuSystem import *
from AppList import *
from buildModule.Singleton import Singleton

Maintenant, j'essaie de décorer mon configsystem en tant que singleton donc mon singleton ressemble à

class Singleton:
    def __init__(self, decorated):
        self._decorated = decorated

    def Instance(self):
        try:
            return self._instance
        except AttributeError:
            self._instance = self._decorated()
            return self._instance

    def __call__(self):
        raise TypeError(
            'Les singletons doivent être accédés via la méthode `Instance`.')

et maintenant, avec ma classe configsystem, si je lis le manuel correctement, cela devrait fonctionner

import Singleton

@Singleton
class ConfigSystem:

mais j'obtiens

TypeError: 'module' object is not callable

J'ai lu la partie du manuel sur les modules plusieurs fois maintenant et je ne comprends pas tout à fait. Pourquoi cela ne fonctionne-t-il pas?

Y a-t-il un tutoriel sur les modules/packages quelque part qui est écrit un peu plus clairement/différemment que le manuel?

3voto

dr jimbob Points 6876

Vous devez modifier import Singleton en from Singleton import Singleton (ou comme l'a suggéré Alex, changer @Singleton en @Singleton.Singleton).

En général, vous devriez utiliser des imports qualifiés pour éviter les collisions de noms, par exemple, import SomeModule avec un appel comme SomeModule.SomeClass ou pour la concision quelque chose comme import SomeModule as SM avec un appel comme SM.SomeClass ou SM.some_function plutôt que d'importer tout depuis un module comme from SomeModule import *.

Vous avez des collisions de noms, où Singleton fait référence au module (par exemple, Singleton.py un fichier qui est une collection de classes/fonctions/variables) plutôt que la classe Singleton (class Singleton(object)). Plus précisément, dans votre décorateur @Singleton, Singleton fait référence au module (vous import some_module ou from some_module import a_class_or_object) plutôt qu'à une classe ou une fonction.

2voto

Alex Smith Points 1140

Changez soit import Singleton en from Singleton import Singleton, soit @Singleton en @Singleton.Singleton.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X