본문 바로가기
파이썬

파이썬 문자열을 사용하여 클래스를 인스턴스화 할 수 있습니까?

by º기록 2020. 10. 5.
반응형

빌더 패턴을 사용하여 다양한 구성 가능성을 분리합니다. 기본적으로 ID (ID12345와 같은)라는 이름의 클래스가 있습니다. 이들은 모두 기본 빌더 클래스에서 상속됩니다. 스크립트에서이 앱이 실행될 때마다 각 클래스 (약 50 개)에 대한 인스턴스를 인스턴스화해야합니다. 그래서, 나는 다음과 같은 것을하는 대신에 확인하려고 노력하고 있습니다.

ProcessDirector = ProcessDirector()
ID12345 = ID12345()
ID01234 = ID01234()

ProcessDirector.construct(ID12345)
ProcessDirector.construct(ID01234)

ID12345.run()
ID01234.run()

다음과 같이 할 수 있습니까? (작동하지 않는다는 것을 알고 있습니다) :

IDS = ["ID12345", "ID01234"]

ProcessDirector = ProcessDirector()
for id in IDS:
  builder = id() #some how instantiate class from string
  ProcessDirector.construct(builder)
  builder.run()

이렇게하면 나중에 새 ID를 추가해야 할 때 코드 전체에 새 ID를 추가하는 대신 IDS 목록에 ID를 추가하기 만하면됩니다.

데이터의 출처에 따라 몇 가지 다른 의견이있는 것 같습니다. 이러한 ID는 다른 사람이 액세스 할 수없는 파일에 입력됩니다. 나는 명령 줄에서 문자열을 읽는 것이 아니며 앞으로 새 ID를 추가 할 때 약간의 변경을 할 수 있기를 바랍니다.

 

해결 방법

 

이것이 당신이 원하는 것인지 확실하지 않지만 문자열에 나열된 클래스를 인스턴스화하는 더 파이썬적인 방법처럼 보입니다.

class idClasses:
    class ID12345:pass
    class ID01234:pass
# could also be: import idClasses

class ProcessDirector:
    def __init__(self):
        self.allClasses = []

    def construct(self, builderName):
        targetClass = getattr(idClasses, builderName)
        instance = targetClass()
        self.allClasses.append(instance)

IDS = ["ID12345", "ID01234"]

director = ProcessDirector()
for id in IDS:
    director.construct(id)

print director.allClasses
# [<__main__.ID12345 instance at 0x7d850>, <__main__.ID01234 instance at 0x7d918>]

 

참조 페이지 https://stackoverflow.com/questions/553784

 

 

반응형

댓글