2011-07-04 5 views
2

foo 클래스에 Foo을 정의하고이 클래스의 인스턴스를 인스턴스화합니다. 다른 모듈에서현재 모듈에서 클래스의 모든 인스턴스를 얻는 방법

, I import foo 수에 의해 인스턴스화 Foo 개체의 목록을 구하십시오

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)] 

내가 모듈 foo 내에서이 작업을 수행 할 수 있다면 편리 할 것이다. 그러나 서면으로 foo이라는 이름은 foo 안에 의미가 없으며 self으로 변경하면 도움이되지 않습니다.

이 모듈 내에서 인트로 스펙 션을 사용하여이 클래스의 모든 인스턴스를 찾는 방법이 있습니까? 목록을 만들고 각 인스턴스를 추가하는 것을 피할 수있는 방법이 있었으면합니다.

+1

"이 클래스의 모든 인스턴스화 된 인스턴스를 얻는 방법"의 이름을 바꾸는 것이 좋습니다. – ninjagecko

답변

8

goal: "import foo and obtain a list of the Foo objects instantiated by..."

당신은 전혀 내성 할 필요가 없습니다. 이 클래스가 클래스라고 상상해보십시오.

class Registered(object): 
    _all = set() 
    def __init__(self): 
     self.__class__._all.add(self) 

데모; 객체의 무리를 인스턴스화하고 그들에게 참조 : 당신이 dir을 사용하고 있기 때문에

>>> Registered() 
>>> Registered() 
>>> Registered() 

>>> Registered._all 
{<__main__.Registered object at 0xcd3210>, <__main__.Registered object at 0xcd3150>, <__main__.Registered object at 0xcd31d0>} 

, 내가 제대로 이해한다면, 당신은 현재 모듈의 전역 변수에있는 모든 개체를 찾기 위해 노력하고 있습니다. 그러나 실제로 현재 모듈의 모든 객체를 가져 오지 않으며 변수에 바인드 된 객체 만 가져옵니다. 즉 당신이 정말로 원하는 있다면, 즉, 당신은 객체가 inspect.currentframe().f_back.f_globals 또는 무언가를 통해 정의 된 모듈을 추적 위를 수정할 수 없습니다 당신이 정말로 원하는 있다면 당신은 {var for name,var in globals() if isinstance(var,Foo)}

을 할 수 있지만, 이것은 당신을 방지 할 수 foo.py 또는 다른 모듈에 정의 된 팩토리 함수를 사용합니다.

실제로 모듈에서 생성 된 모든 인스턴스를 얻으려는 경우 심각한 코딩 문제가 있습니다. 그 모듈에 팩토리 함수 래퍼 (factory function wrapper)를 작성하는 것을 고려해보십시오. 초기화 함수를 따라 가면서 초기화 된 객체를 추적하면서 결과를 반환하는 것을 제외하고는 아무것도하지 않습니다.

+0

이것을 시도하면'NameError : global name '__class__'이 정의되지 않았습니다. ' –

+2

'self .__ class__'가되어야합니다 .... –

+0

@FarmBoy :'__class__'을'Registered'로 대체하십시오; 파이썬 3에서 일을하는 것이 더 좋은 방법입니다 (클래스의 이름을 바꾸기로 결정했다면, 그것을 사용할 때마다 바꿀 필요가 없습니다) – ninjagecko

관련 문제