파이썬에서 클래스 이름에 변수를 사용하십니까?
-
03-07-2019 - |
문제
파이썬에서 객체 및 함수 이름에 변수를 사용하는 방법을 알고 싶습니다. 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의 답변에 표시된 것처럼이 솔루션보다 훨씬 우수합니다.