파이썬에서의 리플렉션은 자바보다 훨씬 쉽고 훨씬 더 유연합니다.
이 튜토리얼을 읽는 것이 좋습니다.
정규화 된 클래스 이름을 가져 와서 클래스를 반환하는 직접 함수 (내가 알고있는)는 없지만이를 빌드하는 데 필요한 모든 부분이 있고 서로 연결할 수 있습니다.
하지만 한 가지 조언 : 파이썬에서 자바 스타일로 프로그래밍하지 마십시오.
하려는 것이 무엇인지 설명해 주시면 더 비단뱀적인 방법을 찾도록 도와 드릴 수 있습니다.
다음은 원하는 작업을 수행하는 함수입니다.
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
이 함수의 반환 값을 마치 클래스 자체 인 것처럼 사용할 수 있습니다.
다음은 사용 예입니다.
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
어떻게 작동합니까?
__import__
클래스를 포함하는 모듈을 가져 오기 위해를 사용 하고 있으며, 먼저 정규화 된 이름에서 모듈 이름을 추출해야합니다. 그런 다음 모듈을 가져옵니다.
m = __import__( module )
이 경우 m
최상위 모듈 만 참조합니다.
예를 들어 클래스가 foo.baz
모듈에 있으면 m
모듈이 foo
됩니다. foo.baz
사용에 대한 참조를 쉽게 얻을 수 있습니다.getattr( m, 'baz' )
최상위 모듈에서 클래스 gettatr
로 이동하려면 클래스 이름의 일부 를 재귀 적으로 사용해야 합니다.
예를 들어, 클래스 이름이 foo.baz.bar.Model
다음 과 같으면 다음을 수행합니다.
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
이 루프에서 일어나는 일입니다.
for comp in parts[1:]:
m = getattr(m, comp)
루프의 끝 m
에서 클래스에 대한 참조가됩니다. 이것은 m
실제로 itslef 클래스임을 의미 합니다. 예를 들면 다음과 같습니다.
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
python 3에서 2.7로 백 포트되었습니다 ( docs.python.org/2/library/importlib.html )