2014-04-11 7 views
1

저는 파이썬에 조금 익숙하며, 누군가 제가 가지고있는 문제를 도와 줄 수 있기를 희망했습니다.이름에 변수를 사용하여 클래스를 인스턴스화하십시오.

목록의 변수를 사용하여 여러 개체를 인스턴스화해야합니다. 2 개 항목, [ "apple", "orange"]의 목록을 가지고 있고 클래스 Fruit을 기반으로 한 인스턴스화 된 클래스의 이름으로 논문을 사용하고 싶습니다. 그래서 두 개의 객체 인 사과와 오렌지로 끝납니다. 과일의

나는 이것을 시도했지만 인스턴스화 된 클래스의 이름으로 변수 이름을 사용하는 방법을 파악할 수 없습니다. 이 코드는 작동하지 않습니다,하지만 같은 내가 달성하기 위해 노력하고있어 당신에게 몇 가지 아이디어를 줄 수도 :이 작동하지 않습니다

class Fruit: 
    pass 

my_list = ["apple", "orange"] 

for item in my_list: 
    item = Fruit() 

type(apple) 

하지만 난이 당신에게 난 무엇인지에 아이디어를 제공 희망 성취하려고 노력한다. 내가보고 싶은 무엇

NameError: name 'apple' is not defined 

은 다음과 같습니다 : 제공 할 수있는 사람이 가장 극명하게 될 것이다 것을

>>> type(apple) 
<type 'instance'> 

모든 포인터 :

덕분에 나는이 오류!

+3

하지 마십시오.변수 이름에서 데이터를 보호하십시오. 대신 사전을 사용하십시오 ('fruits = {}','fruits [item] = Fruit()'). –

+0

+10 Martijn의 의견입니다. 이것은 코드를 개선하기 위해 대부분의 사람들 (저를 포함해서)이 우리 머리에서 빠져 나가야 만했던 가장 지속적인 아이디어 중 하나입니다. – ojdo

답변

2

동적 변수를 생성하는 것은 일반적으로 좋은 생각이 아니다. 그냥 대신 사전 사용

>>> fruits = {} 
>>> for item in my_list: 
... fruits[item] = Fruit() 
... 

>>> [(k, type(v)) for k, v in fruits.items()] 
[('orange', <class '__main__.Fruit'>), ('apple', <class '__main__.Fruit'>)] 

난 당신이 globals()으로 재생하여 전역에서 비슷한 일을 할 수있는 생각을하지만, 나는 아주 나쁜 관행을 고려할 것입니다.

+0

Alex! – Simplified

+0

@OllieSheridan 도움이 된 것을 기쁘게 생각합니다. 매우 환영합니다. –

0

아주 간단 정말, 먼저베이스 새로운 스타일의 클래스를 만들 :

class Fruit(object): 
    pass 

동적으로 여러분이 원하는 서브 클래스 생성 :

Apple = type("Apple", (Fruit,), dict()) 

그런 다음 인스턴스화 :

anapple = Apple() 

type(anapple) 
__main__.Apple 

따라서 apple, orange 등이 있습니다. 모든 종류의 과일입니다. 당신이 공통 조상이 필요하지 않은 경우

, 당신은 object에서 새 클래스를 파생 할 수 있습니다

Apple = type("Apple", (object,), dict()) 

을 이미 이러한 클래스가 정의한 경우 마지막으로, 동적 또는 정적이처럼 그들을 찾아 볼 수 있습니다, 1 부, 동일한 모듈 :

class Apple: pass 
class Orange: pass 

for name in ["Orange", "Apple"]: 
    instance = globals()[name]() 
여기

, globals 따라서, 당신이 사전에 과일을 조회 한 후, 사전을 반환, 따라서 [] 첫번째 () 함수 다음은 클래스와 y를 얻을 수 예 : ()으로 인스턴스화하십시오. 모든 과일이 일부 모듈에 정의 된 마지막 경우

는, 예컨대 :

# fruits.py 
class Apple: pass 
class Orange: pass 

# user code 
import fruits 
anapple = getattr(fruits, "Apple")() 
+0

OP가 여기에 서브 클래 싱을 요청할 것이라고 생각하지 않습니다. –

+0

@Au wini  haudhary 아마도 익명의 클래스를 추가해야 할까 ... –

관련 문제