2010-12-19 4 views
5

특정 클래스의 객체가 호출 될 때만 가져올 모듈을 가져 오려고합니다. 예를 들어 :파이썬 모듈을 하나의 클래스로만 가져 오기

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() 

이는 One.blah() 함수가 호출되는 NameError: global name 'OneHelper' is not defined됩니다. 지금까지 제가 발견 한 유일한 사실은 그것을 사용하는 실제 함수로 모듈을 가져 오는 것입니다. 그래서 :

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() 

그러나 나는 그것을 사용할 각 기능, 나는 그것이 전체 클래스에 사용할 수있게하려면에 모듈을 수입하고 싶지 않지만, 인스턴스의 경우 그 클래스는 인스턴스화됩니다. 죄송 합니다만 충분히 명확하지 않은 경우 ...

+0

인스턴스화 된 클래스를 가져온 다음 다른 함수 내에서 함수를 호출하는 함수를 만들 수 있습니다. 어쩌면 작은 해결 방법. –

답변

8

import OneHelper은 클래스 속성이되어 잘 작동합니다. 수업을 정의한 후 dir(One)으로 확인할 수 있습니다. OneHelper 속성이 있습니다. One.OneHelper은 모듈에 대한 참조입니다. 예를 들어 인스턴스에서 해당 메소드에서 self.OneHelper으로 액세스 할 수 있습니다. __init__

+0

물론, 지금 나는 어리석은 롤을 느낀다 :/통찰력을위한 감사! –

+0

어리 석을 느끼지 마라. import의 99.44 %에서 일어나는 일이기 때문에,'import'가 항상 모듈의 전역 네임 스페이스로 임포트한다고 가정하는 것이 합리적이다. 물론 실제로 작동하는 방식이 아니지만 무리한 출발점이 아닙니다. 어떻게 작동하는지 직접 확인해야했습니다. 다행스럽게도 확실하지 않을 때 약간의 실험과 검사를 통해 파이썬에서 먼 길을 찾을 수 있습니다. – kindall

2

가져 오기를 (. 또한 One.OneHelper로 계속 액세스 할 수 있습니다) 어떤 속성에 속성 :

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() 

귀하의 예를 재미 보인다 모듈이 호출의 포인트입니다 무엇을 가져 실패하는 경우 때문에 나중에?

+0

+1 예외를 잡아 내지 않고 'except' 블록에서 아무것도하지 않아야하며,'ImportError '에 대해 두 번 간다. 거의 절대 포착해서는 안된다. –

0

모듈을 가져 오기 전에 global OneHelper을 사용해보십시오. OneHelper가 전역 네임 스페이스에 추가됩니다.

관련 문제