문제

파이썬에서 객체 및 함수 이름에 변수를 사용하는 방법을 알고 싶습니다. PHP에서는 다음을 수행 할 수 있습니다.

$className = "MyClass";

$newObject = new $className();

파이썬에서 이런 종류의 일을 어떻게합니까? 아니면, 나는 파이썬과의 근본적인 차이를 완전히 인식하지 못하고 있으며, 그렇다면 무엇입니까?

도움이 되었습니까?

해결책

파이썬에서

className = MyClass
newObject = className()

첫 번째 줄은 변수를 만듭니다 className 같은 것을 참조하십시오 MyClass. 그런 다음 다음 줄이 호출됩니다 MyClass 생성자 className 변하기 쉬운.

구체적인 예로 :

>>> className = list
>>> newObject = className()
>>> newObject
[]

(파이썬에서 list 의 생성자입니다 list 수업.)

차이점은 PHP에서 문자열이라고 말하고 싶은 클래스의 이름을 나타내고 파이썬에서는 동일한 클래스를 직접 참조 할 수 있다는 것입니다. 만약 너라면 ~ 해야 하다 문자열을 사용하십시오 (예 : 클래스 이름이 동적으로 생성되는 경우) 다른 기술을 사용해야합니다.

다른 팁

some_module에 "class_name"이라는 클래스가 있다고 가정합니다.

import some_module
klass = getattr(some_module, "class_name")
some_object = klass()

문자열이 사용자로부터 온 경우 문자열을 코드로 바꾸는 것이 위험 할 수 있으므로이 상황에서 보안을 명심해야합니다. :)

다른 방법 중 하나 (여전히 "class_name"을 사용하고 있다고 가정) :

class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']()  #call the object once we've pulled it out of the dict

후자의 방법은 아마도이 작업을 수행하는 가장 안전한 방법 일 것입니다. 따라서 가능한 경우 사용해야 할 것입니다.

Python에서 동적 클래스를 만들어야하는 경우 (즉, 이름이 변수 인) 3 개의 매개 변수를 취하는 Type ()를 사용할 수 있습니다. 이름,베이스, attrs

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • 그러나 이것은 객체를 '인스턴스화'하지 않습니다 (즉, 생성자 등을 호출하지 않습니다. 같은 이름의 새 (!) 클래스를 만듭니다.

당신이 이것을 가지고 있다면 :

class MyClass:
    def __init__(self):
        print "MyClass"

그런 다음 일반적으로 다음을 수행합니다.

>>> x = MyClass()
MyClass

그러나 당신은 또한 이것을 할 수 있습니다. 이것이 제가 당신이 묻는 것입니다.

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

그러나 "Eval ()"켜기를 사용하는 문자열을 어디서 얻을 수 있는지주의하십시오.

업데이트 : 사용 type() Coleifer의 답변에 표시된 것처럼이 솔루션보다 훨씬 우수합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top