7 votes

Importation sans exécution de la classe - python

Mon problème concerne le fait que j'ai un fichier qui contient une classe et à l'intérieur de cette classe, il y a beaucoup de code qui sera exécuté.

Donc, chaque fois que j'importe ce fichier, il sera exécuté sans créer un objet de la classe ! Voici un exemple :

FICHIER X

class d:
    def __init__(self):
        print 'imprimer cela NE sera pas imprimé'
    print "ceci sera imprimé"

Fichier B

import x

La sortie est ceci sera imprimé, donc ma question est comment éviter de l'exécuter avant de créer un nouvel objet ?

3voto

Tarantula Points 4231

Vous ne pouvez pas faire cela en Python, dans Python chaque classe est un objet de premier niveau, une classe Python est également un objet et un attribut de classe peut exister même s'il n'y a pas d'instances de cette classe. Si vous voulez simplement supprimer la sortie de l'instruction d'impression, vous pouvez rediriger la sortie de vos instructions d'impression au moment de l'importation ou créer un contexte comme celui fourni dans cette première réponse et utiliser l'instruction __import__ manuellement.

1voto

stleary Points 402

Si tout ce que vous voulez faire est de supprimer l'impression (ou toute autre déclaration exécutable) lors de l'importation, entourez-les d'une vérification de l'exécution du module supérieur :

if __name__ == '__main__':
    print 'this will be printed'

Cela empêchera l'impression lors de l'importation, mais permettra de l'exécuter lorsque le module est exécuté de manière interactive.

1voto

martineau Points 21665

Comme l'ont souligné d'autres, la deuxième print est exécutée car elle fait partie de la suite d'instructions formant la déclaration de la classe - toutes sont exécutées lorsque le module dans lequel elles se trouvent est importé car la déclaration fait partie de son code de niveau supérieur, contrairement à une fonction ou méthode imbriquée.

La première instruction print n'est pas exécutée car elle fait partie de la définition d'une méthode, dont les instructions ne s'exécutent pas tant qu'elle n'est pas appelée - contrairement à celles à l'intérieur d'une définition de classe. Typiquement, la méthode __init__() d'une classe est appelée indirectement lorsqu'une instance de la classe est créée en utilisant le nom de la classe, qui serait d() pour une nommée d comme la vôtre.

Ainsi, bien que cela contredise ce qui est dans le texte des chaînes affichées, pour que cette deuxième instruction print ne s'exécute que lors de la création d'instances de la classe (tout comme la première), vous devriez également la rendre partie de la même méthode (ou appelée par celle-ci). En d'autres termes, après avoir fait cela, aucune des deux ne s'exécutera lorsque le fichier contenant la classe est importé, mais les deux le feront lorsque des instances de la classe seront créées. Voici ce que je veux dire:

Fichier x.py:

class d:
    def __init__(self):
        print 'print this will NOT be printed'  # not true
        print "this will be printed when object is created"

Fichier b.py:

import x  # aucune instruction print n'est exécutée
obj = d()  # les deux instructions print seront exécutées maintenant

1voto

Veky Points 142

Votre question est la suivante : j'ai une fonction

def f():
    print(1)
    print(2)

Comment faire pour que print(1) soit exécuté, mais pas print(2) ? Il n'y a vraiment pas de moyen facile. Ce que vous devez comprendre, c'est que def __init__(self) est également une instruction. Votre classe se compose de cette instruction et de l'instruction print. Il n'y a donc pas de moyen facile d'exécuter l'une sans l'autre. Bien sûr, si vous pouvez modifier la source de la classe, placez simplement le print à l'intérieur de __init__, où il sera appelé après la création de l'instance.

0voto

RocketDonkey Points 16205

(Copié d'un commentaire ci-dessus au cas où cela serait utile aux lecteurs futurs)

D'accord avec @mgilson et @EmmettJButler - ce code est probablement mieux placé dans le __init__. Lorsque Python importe un module, il exécute le code au niveau du module, y compris la construction de la définition de la classe avec les méthodes de classe, etc. Par conséquent, lorsque vous importez X et que la définition de la classe d est construite (pour que vous puissiez l'appeler depuis B), le code à l'intérieur de la classe est exécuté. Habituellement, cela signifie que les variables de niveau classe sont définies et que les méthodes non liées sont prêtes à être attachées aux instances, mais dans votre cas, cela signifie que votre déclaration sera imprimée.

Comme suggéré par les autres, refaire le code est probablement votre meilleure option.

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