2015-01-06 2 views
0

가정하자 내가 가지고있는 다음과 같은 클래스를 종속성을 생성합니다파이썬은 동적으로 클래스 인스턴스 사이에

class base(object): 
    def __init__(self, name): 
    self.name = name 
    self.last_x = 0.0 
    def calc(self, x): 
    return x 

class A(base): 
    def calc(self, x): 
    return f_A(x) 

class B(base): 
    def calc(self, x): 
    return f_B(x) 

... 

글자 각각의 클래스는 기본적으로 해당 글자 기능 f_A, f_B에 대한 래퍼입니다. 클래스 인스턴스는 상태 변수 self.last_x을 포함하고 문자 기능은 상태 의존적 인 것으로 가정된다 (즉, 마르코프 체인 유형 프로세스).

서로 다른 기능적인 회선을 시험하기 위해 이러한 클래스의 인스턴스간에 종속성 체인을 정의하고 싶습니다. 우리는 숫자 입력 값 x에 체인 [a, b]을 계산하고 싶었 예를 들어, 우리는

a = A('firstnode') 
b = B('secondnode') 

res = b.calc(a.calc(x)) 
목표는 각 중간에서 결과에 액세스 할 수있는 반면, 임의의 긴 사슬이 작업을 수행하는 것입니다

을해야 할 것입니다 계산. 나는. 체인이 [a, b, c]이라면 나는 [a][a, b]의 접근 가능한 결과를 만들고 싶다. (이것이 내가 현재 구현 된 각 노드에 이름 문자열을 포함시킨 이유이다).

이 유스 케이스의 클래스와 데이터 구조를 설정하는 올바른 방법은 무엇입니까?

지금까지 여러 가지 사전을 다루는 상당히 무거운 솔루션이 있지만 사소한 것으로 느껴지고 분명히 뭔가 빠져있을 수도 있습니다.

+0

그래서'[a, b, c]'가 있다면'res = c.calc (b.calc (a.calc (x)))'를 원합니까? – Marcin

+0

네, 맞습니다. – wfh

+1

A 클래스와 B 클래스에서'a (x)'와'b (x) '는 무엇입니까? – Marcin

답변

0

불행히도 이름을 부적절하게 재사용하고 있기 때문에 이전 값이 숨겨져 있습니다. 예컨대, 후 : 실패 (할당 이전에 a이 기능에 결합 된 이름 사실을 교체 이후)이 인스턴스를 호출하려고합니다 a.calc를 호출

a = A('firstnode') 

. 가장 현명한 명명법을 사용하는 것이 가장 좋습니다. 실제 아니다 어떤 이유로 경우 클래스 정의시 내부적으로 함수 이름을 바인드해야 다음 a=a 등등 트릭을 수행하고,

class A(base): 
    def calc(self, x, a=a): 
     return a(x) 

.

두 번째 장애물은 각 클래스의 최종 결과가 저장되기를 원하지만, 저장하지 말아야한다는 것입니다. 코드를 예 :

으로 변경하십시오.
class A(base): 
    def calc(self, x, a=a): 
     self.last_result = a(x) 
     return self.last_result 

일단 완료되면 클래스 인스턴스 목록에서 원하는 작업을 수행하는 것이 가장 적은 문제입니다. 예컨대

def doit(instances, x): 
    curr = x 
    for inst in instances: curr=inst.calc(curr) 
    return curr 

[inst.last_result for inst in instances] 

는 당신에게 당신이 찾고있는 중간 결과를 줄 것이다.

관련 문제