2011-07-28 20 views
36

Actualmente estoy escribiendo una clase que necesita os, stat y algunos otros.Importación de módulos dentro de la clase python

¿Cuál es la mejor manera de importar estos módulos en mi clase?

Estoy pensando en cuándo otros lo usarán, quiero que los módulos de 'dependencia' ya sean importados cuando se crea una instancia de la clase.

Ahora los estoy importando en mis métodos, pero tal vez haya una mejor solución.

Respuesta

33

Si su módulo siempre importará otro módulo, colóquelo siempre en la parte superior como PEP 8 y las otras respuestas indican. Además, como @delnan menciona en un comentario, sys, os, etc. se están usando de todos modos, por lo que no está de más importarlas globalmente.

Sin embargo, no hay nada de malo con las importaciones condicionales, si realmente solo necesita un módulo bajo ciertas condiciones de tiempo de ejecución.

Si sólo desea importar si la clase es definido, como si la clase está en un bloque condicional u otra clase o método, se puede hacer algo como esto:

condition = True 

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

    C.os 
    c = C() 

Si solo quiere que se importe si la clase es instanciada, hágalo en __new__ o __init__.

+6

Si importo un módulo en un método (como '__init__'), ¿no importaría ese módulo varias veces si creo varias instancias? Por lo tanto, ¿afectaría el rendimiento, en comparación con la importación global? –

+1

¿No debería() después de __import, not []? Aparece el error "TypeError: 'builtin_function_or_method' el objeto no tiene el atributo '__getitem__'" cuando uso corchetes. Después de cambiarlo a() funciona, pero tengo que prefijar el módulo importado con el nombre de la clase, incluso cuando uso el módulo importado dentro de la clase, prefiero no hacer eso. De cualquier forma alrededor de esto? – Samuel

+2

@Samuel: Gracias por la corrección, arreglé la importación. Si desea que el objeto importado esté disponible globalmente, simplemente use la instrucción 'import' normal. Sin embargo, eso no es una buena idea con las importaciones condicionales, ya que puede tener código * fuera * del condicional que solo funciona si la rama del condicional con la importación se ejecutó primero.Si usa '__import__' como arriba, evitará crear un nombre global para el objeto. – agf

0

This (busque la sección "Importaciones") el papel oficial indica que import s normalmente se debe poner en la parte superior de su archivo de origen. Me atendría a esta regla, aparte de casos especiales.

8

PEP 8 de las importaciones:

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

Esto hace que sea fácil de ver todos los módulos utilizados por el archivo a la mano, y evita tener que repetir la importación en varios lugares cuando un módulo se utiliza en más de un lugar . Todo lo demás (por ejemplo, las importaciones a nivel de función/método) debe ser una excepción absoluta y debe justificarse bien.

+10

Esto es para __incondicional imports__. Si solo quieres importarlos si esa clase está instanciada, obviamente esto no se aplica. – agf

+0

@agf: Rara vez hay una razón para importar condicionalmente. Especialmente con los módulos que usa OP, probablemente ya estén siendo utilizados por la implementación (intente con 'python -c 'import sys; print sys.modules.keys()' '). – delnan

5
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) 
Cuestiones relacionadas