2013-06-01 3 views
1

나는 다음과 같습니다어떻게 변수를 인스턴스화 할 수 있습니까?

  • 객체
    • __init__.py
    • define.py

define.py :

class Place: 
    def __init__(self,name,inhabitants): 
     self.name=name 
     self.inhabitants=inhabitants 
     myFunction.toStoreThings.on.db(name,inhabitants,'places') 
    def someUsefulFunction(self): 
     pass 

import objects, moon=objects.Place('Moon',[])을 실행하면 인터프리터를 닫고 다시 엽니 다. 분명히 moon 인스턴스가 풀렸지 만 데이터베이스에 (u'Moon',u'[]')이 저장되어 있습니다. 이미 __init__.py을 데이터베이스에서 가져오고 그 정보를 unstring으로 검색했지만, 'Moon'Moon=Place('Moon',[])으로 인스턴스화하고 싶습니다. 따라서 인터프리터를 닫은 후에도 Moon.someUsefulFunction() 또는 objects.Moon.someUsefulFunction()을 사용할 수 있습니다. 이것을 어떻게 할 수 있습니까? 내가

을 사용할 수 있습니다

# myFunction() creates a dictionary `objdic` of the stuff in the database 
# >>>objects.objdic 
# {'places' : [['Moon',[]]]} 
instancesdic={} 
instancesdic['places']={} 
instancesdic['places'][objdic['places'][0][0]]=Place(*objdic['places'][0]) 

>>> objects.instancesdic 
{'places': {'Moon': <objects.Place instance at 0x1b29248>}} 

이 방법을 제공합니다 :

__init__.py :


나는 이런 식으로 일을 할 수 있었다
objects.instancesdic['places']['Moon'].someUsefulFunction() 

어느 쪽이 괜찮습니까?하지만 정말로 싶습니다. objects.Moon.someUsefulFunction().

TypeError: 'str' object does not support item assignment 

또는 사전에 바로 키

대신 Moon 인스턴스가 생성되는, 인스턴스에 변경되는 : 시도는 모든 일을 Moon 결과 중 하나에 전화를합니다.

답변

1

setattr 함수를 사용하여 objects 모듈에서 모듈 속성을 설정하거나 해당 모듈에서 globals을 업데이트 할 수 있습니다. 내 그래서 __init__.py 당신이 할 수 있습니다 :

objDict = {obj[0]: Place(*obj) for obj in objdict['places']} 
globals().update(objDict) 

이는하지만,주의해야 할 몇 가지 위험이 있습니다 등

, 당신이 object.Moon을 할 수있게된다. 어떤 오브젝트가 이미 objects에 생성 된 오브젝트와 같은 이름을 가진 경우 해당 오브젝트를 덮어 씁니다. 따라서 objectsmyFunc이라는 함수가 있고 myFunc이라는 개체를 만들면 함수를 개체로 덮어 쓸 수 있습니다. 어떤 순서로 작업할지에 따라 덮어 쓰기됩니다.

이런 이유로 __init__.py에서이 작업을 자동으로 수행하는 것은 좋지 않습니다. 대화 형 인터프리터에서 사용하기 쉽도록이 작업을 수행하는 것이 좋지만이 방법으로 전역을 수정하면 스크립트에서 사용하면 추악 해집니다.initGlobals 또는 뭔가라는 함수를 만든 다음이 함수를 호출하여 대화 형 환경을 설정하는 것이 더 좋은 방법 일 수 있습니다. 위에서 설명한 코드를 그러한 함수에 넣은 다음 호출하면 환경이 설정됩니다. 이를 통해 모듈의 간단한 가져 오기를 실제로 db에서 글로벌 객체를 만드는 것과 분리 할 수 ​​있습니다. 가끔씩 하나만하고 다른 하나는 할 수 없기 때문일 수 있습니다.

+0

코드가 작동했는데 이제는 내가하려는 일을하지 않는 것이 더 낫다는 것을 이해합니다. 그렇다면 사전을 고수 할 것입니다. 고맙습니다. – Alex

관련 문제