it-swarm.com.de

Importieren von Modulen innerhalb der Python-Klasse

Ich schreibe gerade eine Klasse, die os, stat und einige andere benötigt.

Wie importiere ich diese Module am besten in meiner Klasse?

Ich denke darüber nach, wann andere es verwenden werden. Ich möchte, dass die 'Abhängigkeit'-Module bereits importiert werden, wenn die Klasse instanziiert wird.

Jetzt importiere ich sie in meine Methoden, aber vielleicht gibt es eine bessere Lösung.

41
Paul

Wenn Ihr Modul immer ein anderes Modul importiert, setzen Sie es immer als PEP 8 und die anderen Antworten zeigen an. Wie @delnan in einem Kommentar erwähnt, werden sys, os usw. ohnehin verwendet, sodass es nicht schadet, sie global zu importieren.

An bedingten Importen ist jedoch nichts auszusetzen, wenn Sie wirklich nur unter bestimmten Laufzeitbedingungen ein Modul benötigen.

Wenn Sie sie nur importieren möchten, wenn die Klasse defined ist, z. B. wenn sich die Klasse in einem bedingten Block oder in einer anderen Klasse oder Methode befindet, können Sie Folgendes tun:

condition = True

if condition:
    class C(object):
        os = __import__('os')
        def __init__(self):
            print self.os.listdir

    C.os
    c = C()

Wenn Sie möchten, dass es nur importiert wird, wenn die Klasse instanziiert ist, tun Sie dies in __new__ oder __init__.

39
agf

PEP 8 zu den Einfuhren:

Importe werden immer an den Anfang der Datei gestellt, direkt nach jedem Modul Kommentare und Dokumentstrings sowie vor Modul-Globals und -Konstanten.

Dies macht es einfach, alle von der Datei verwendeten Module zu sehen, und vermeidet, dass der Import an mehreren Stellen repliziert werden muss, wenn ein Modul an mehreren Stellen verwendet wird. Alles andere (z. B. Importe auf Funktions-/Methodenebene) sollte eine absolute Ausnahme sein und muss gut begründet werden. 

10
user395760
import sys
from importlib import import_module

class Foo():

    def __init__(self):

        if self.condition:
            self.importedModule = import_module('moduleName')

        if 'moduleName' in sys.modules:
            self.importedModule.callFunction(params)

        #or

        if self.condition:
            self.importedModule.callFunction(params)
5
nvd

Diese (Suche nach dem Abschnitt "Importe"), offizielle Veröffentlichung, besagt, dass imports normalerweise in der Quelldatei oben stehen sollte. Abgesehen von Sonderfällen würde ich mich an diese Regel halten.

0
Constantinius