개발/Python
java Reflection 과 같은 python importlib
cozynow
2020. 4. 17. 00:46
1. python 동적으로 객체를 생성하여 사용할 경우 importlib를 이용하면 해결할 수 있다.
1.1. importlib 는 java의 Reflection 과 같이 사용이 가능하다.
1.2 샘플코드
- MyMath.py 라고 파일을 만들어서 아래 코드를 입력한다.
# 본 파일을 MyMath.py 이라고 가정함 class Cal(): def say(self, name): print("Hello World!, {0}".format(name)) def add(self, one, two): print("{} + {}".format(one, two)) return one+two
- 기본적인 모듈 추가방법
. 이제 위의 모듈을 호출할 별도의 파일이라고 할때
from MyMath import Cal myCal = Cal() myCal.say('akami') myCal.add(3,4)
. 결과
Hello World!, akami 3 + 4
- importlib 를 사용하는 경우
import importlib mod = importlib.import_module('MyMath') #방법1 : getattr 를 통해서 갖어오기 cls = getattr(mod, 'Cal')() cls.say('a') #방법2 : mod를 타이핑하고, '.'를 누르면 에디터에서 akamilib 냐 선언된 클래스 이름을 모두 갖어오게 된다. 이때 ide code assistance 를 이용하면 편하다. cls = mod.Cal() # <- 클래서를 생성할때, 생성자 변수를 받지 않아도, 끝에() 를 넣어줘야 한다. cls.say('a')
. 결과
Hello World!, a Hello World!, a
그외 내장된 Lib/inspect.py 를 이용하면 함수이름만 가지고도 함수의 형태를 모두 추출이 가능하다.
print(Cal.add.__code__.co_argcount) print(Cal.add.__code__.co_varnames) print(Cal.add.__code__.co_varnames[0]) print(Cal.add.__code__.co_varnames[1]) print("{}은 숫자인가? {}".format(Cal.add.__code__.co_varnames[1],Cal.add.__code__.co_varnames[1].isnumeric())) print("{}은 문자인가? {}".format(Cal.add.__code__.co_varnames[1],Cal.add.__code__.co_varnames[1].isalpha())) print(Cal.add.__code__.co_varnames[1].isalpha()) print(Cal.add.__code__.co_varnames[2]) print(Cal.add.__code__.co_filename) print(Cal.add.__code__.co_consts)
- 결과
3 ('self', 'one', 'two') self one one은 숫자인가? False one은 문자인가? True True two /Volumes/DATA/workspace_python/predata/MyMath.py (None, '{} + {}')