개발/Python

java Reflection 과 같은 python importlib

cozynow 2020. 4. 17. 00:46

1. python 동적으로 객체를 생성하여 사용할 경우 importlib를 이용하면 해결할 수 있다.

1.1. importlibjava의 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, '{} + {}')