현재 확장 모듈 클래스를 지원하는 일종의 작은 API를 작성하고 있습니다. 사용자는 구성에 클래스 이름을 쓸 수 있어야하며 프로그램에서 사용됩니다. 클래스 모듈은 기본 모듈 클래스의 인스턴스를 반환하기 위해 create(**kwargs)
이라는 함수를 가지고 있으며 특수 폴더에 배치됩니다. 그러나 isinstance 검사는 가져 오기가 동적으로 수행되는 즉시 실패합니다.파이썬 2.7 동적으로 가져온 모듈 클래스에서 isinstance가 실패합니다.
모듈
(LIB/서비스/핑)에class Service:
def __init__(self, **kwargs):
#some initialization
예시 모듈 클래스 (LIB/서비스/서비스) LIB/서비스/이름
모듈 기본 클래스를 배치
class PingService(Service):
def __init__(self, **kwargs):
Service.__init__(self,**kwargs)
# uninteresting init
def create(kwargs):
return PingService(**kwargs)
가져 오기 기능
import sys
from lib.services.service import Service
def doimport(clazz, modPart, kw, class_check):
path = "lib/" + modPart
sys.path.append(path)
mod = __import__(clazz)
item = mod.create(kw)
if class_check(item):
print "im happy"
return item
코드를 호출
class_check = lambda service: isinstance(service, Service)
s = doimport("ping", "services", {},class_check)
print s
from lib.services.ping import create
pingService = create({})
if isinstance(pingService, Service):
print "why this?"
도대체 내가 뭐하는 거지 여기
그냥 추출하고 인수없이test.py
을 실행
zip example
먼저 다음
sys.path
에lib/services
를 추가하면 그것이 내가 이상한 발견 상속, ... 또한일을 만들 수 없습니다, 좀 더 강력한 보인다
imp.load_source
을 사용하고 있습니다 .x를 사용하면 구식 클래스를 사용하지 않아야합니다. 'class Service :'가 아니라'class Service (object) :'를 항상 수행하십시오. 예전 스타일의 클래스에 대한 규칙은 새로운 스타일의 클래스와 크게 다르며 실제로 두 가지를 배우고 싶지 않습니다. – abarnert둘째, 코드가 전혀 실행되지 않습니다. 예를 들어,'mod.create (clazzItem)'은'clazzItem'에'NameError'를 발생시킵니다. 우리에게 실제적인 박살난, 실행 가능한 예를 들어주세요. – abarnert
첫 번째 :이 질문은 내 질문과는 아무 상관이 없습니다. 두 번째 : 예전 스타일 수업에 대한 규칙이 마음에 듭니다. –