2016-10-27 6 views
0

사람은 두 가지 속성, 즉 heightweight을 가진 새로운 클래스입니다.가져온 모델에서 모든 클래스 인스턴스를 가져 오는 방법은 무엇입니까?

class People: 

    def __init__(self, height, weight): 
     self.height = height 
     self.weight = weight 

나는 같은 클래스와이 클래스의 일부 개체가 다른 file.py를 가져올합니다. 예를 들면 다음과 같습니다.

p1 = People(185, 87) 
p2 = People(167, 73) 
p3 = People(173, 90) 

그러나 각 변수가 호출되는 방식과 주어진 파일에 변수가 얼마나 많은지는 알지 못합니다. 가져온 파일의 모든 개체를 가져올 수 있습니까? 목표는 여러 파일에서 객체의 list()를 만드는 것입니다.

+0

정의 다음 isinstance 체크 pred에 대한 True 인 모듈 obj에서 다른 모듈에서 볼 수있는 모듈에서 'isinstance (v, People)'인지 확인하십시오. 이것은 모듈의 전역 범위에있는 변수들만 포함합니다; 정말 유용하니? – deceze

+1

당신은 정말로 여기에서 뒤에 있니? 당신이 해결하려고하는 문제는 당신이 정말로 가져야 할 문제와 같지 않기 때문에. –

+0

클래스 인스턴스를 assert 함수로 다른 클래스 인스턴스와 비교해야하며 클래스 인스턴스가 올바르게 구현되었는지 확인해야합니다. 어떤 종류의 테스트 프로그램이 있습니다. –

답변

1

이 작업을 수행하는 좋은 방법은 pred 매개 변수를 사용하여 inspect.getmembers 일 수 있습니다.

먼저 모듈의 모든 사용자 정의 클래스를 inspect.isclass으로 가져온 다음 이전에 가지고있는 클래스의 인스턴스를 캡처 할 새 조건부를 만들 수 있습니다.

from inspect import getmembers, isclass 
# the module defining the objects 
import obj 

# getmembers returns list of (name, val) tuples, grab vals 
clses = tuple(x[1] for x in getmembers(obj, isclass)) 

이제 clses 클래스의 튜플은 다음과 같습니다 : inspect에 정의 된

처음

, 클래스를 잡는 것은 isclass 용이합니다

print(clses) # (obj.People,) 

클래스가 이미 사전에 알려진 경우,이전 단계는 물론 필요하지 않습니다.; 찾아야 할 클래스의 튜플을 만들고 다음 단계로 계속 진행하십시오.

그런 다음 clses의 클래스 중 하나의 인스턴스 인 객체를 잡고 새로운 술어 (충분 간단한 lambda)를 만들 수 있습니다

pred = lambda x: isinstance(x, clses) 
instances = getmembers(obj, pred) 

지금 instances 어떤 이름으로 채워지고있는 결과 당신은 모든 변수를 통해 갈 수

print(instances) 
[('p1', <obj.People at 0x7f436739ce10>), 
('p2', <obj.People at 0x7f436739c898>), 
('p3', <obj.People at 0x7f436739cc18>)] 
관련 문제