2010-12-19 21 views
5

Estoy tratando de obtener un módulo para importar, pero sólo si un objeto de una clase específica se llama. Por ejemplo:Python importar un módulo en una clase única

class One(object): 
    try: 
     import OneHelper 
    except ImportError: 
     pass 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     # this function does 
     OneHelper.blah() 

Esto provoca una NameError: global name 'OneHelper' is not defined cuando la función se llama One.blah(). Hasta ahora, lo único que he encontrado que funciona es importar el módulo a las funciones reales que lo usan. Por lo tanto:

class One(object): 
    def __init__(self): 
     # this function doesn't use OneHelper 
     ... 

    def blah(self): 
     try: 
      import OneHelper 
     except ImportError: 
      pass 
     # this function does 
     OneHelper.blah() 

Pero yo no quiero tener que importar el módulo en cada función que quiero utilizarlo en, yo quiero que sea disponible para toda la clase, pero solamente si una instancia de esa clase es instanciada. Disculpas si no estoy siendo lo suficientemente claro ...

+0

usted podría intentar crear una función que importa la clase si una instancia y luego simplemente llamar a la función desde dentro de las otras funciones. Pequeña solución tal vez. –

Respuesta

8

El import OneHelper funciona bien en la clase, por lo que es un atributo de clase. Puede verificar esto con dir(One) después de definir su clase; ahí está su atributo OneHelper. One.OneHelper es una referencia al módulo. En una instancia, por supuesto, puede acceder a ella como self.OneHelper desde sus métodos. (También puede seguir accediendo a ella como One.OneHelper.)

+0

por supuesto, ahora me siento estúpido jajaja:/gracias por la visión! –

+0

No se sienta estúpido ... es perfectamente razonable suponer que 'import' siempre importa en el espacio de nombres global del módulo porque eso es lo que ocurre en el 99.44% de los usos. Por supuesto, así no es como funciona realmente, pero no es un punto de partida irracional. Tuve que probarlo yo mismo para estar seguro de cómo se comporta. Afortunadamente, cuando no estés seguro, un poco de experimentación e inspección te ayudarán a recorrer un largo camino en Python. – kindall

2

importación en __init__ y atribuir a alguna propiedad:

class One(object): 
    def __init__(self): 
     try: 
      import OneHelper 
     except ImportError: 
      self.OneHelper = None 
     else: 
      self.OneHelper = OneHelper 
    def blah(self): 
     if self.OneHelper: 
      self.OneHelper.blah() 

Su ejemplo se ve rara, porque si el módulo no se puede importar cuál es el punto de llamar ¿eso mas tarde?

+0

1 casi nunca se debe capturar una excepción y no hacer nada en el bloque 'except', y eso va doble para' ImportError', que debe coger casi nunca en absoluto (es decir, sólo cuando se tiene un repliegue de algún tipo). –

0

También puede considerar el uso de global OneHelper antes de importar el módulo. Esto agrega OneHelper al espacio de nombre global.

Cuestiones relacionadas