2012-05-24 4 views
1

는 I 클래스를 A는 입력 클래스의 모든 활성 변수를 상속

class A(object): 
    def __init__(self, x, y) 
     self.x = x 
     self.y = y 

있고 그때 A (ITS 염기로서 A을 대신) 및 다른 파라미터

의해 초기화되는 클래스 B 정의 상상
class B(object): 
    def __init__(self, a): 
     if isinstance(a, A): 
      self.a = a 

, A을 생각되는 질문은 B 인식하게하는 것이 가능하고, 정의 된 변수의 거대한 양의가 자주 B에서 언급해야한다 내가

self.x 

보다는

self.a.x 

을 할 수 B에 있도록 A에서 그 변수의?

이 자동 변수를 상속받을 수 있다는 것은 다소 위험하고 심지어 파괴적 일 수도 있지만 많은 여분의 입력은 다소 복잡해 보입니다. 이 상속을 일시적으로 또는 작은 스 니펫 코드로 설정하는 옵션이 유용 할 것입니다.

편집

__dict__ 가능 methodsfunctions을 포함한 본질적으로 모든 것을, 단지 숫자 변수를 유지하기를 불러옵니다?

+0

'__dict__'를 복제하는 것은 아주 가깝지만, 제 수정 된 질문을보십시오 : 수치 변수 (숫자와 배열) 만 상속하는 것을 선호하십시오. – nye17

답변

2

당신은 쓸 수 있습니다 : 당신이 B의 속성에 액세스 할 때마다 a 그 속성이있는 경우

class B(object): 
    def __getattr__(self, attr): 
     if hasattr(self.a, attr): 
      return getattr(self.a, attr) 
     else: 
      return object.__getattribute__(self, attr) 

, 그것을 확인합니다. 그렇다면, 대신 그걸 돌려 줄거야. 그렇지 않으면 B 자체에서 속성을 조회합니다. 파이썬에서

+0

다른 두 개의 대답은 아마도 가장 쉽고 간단하지만 아마도 가장 유연합니다. 그리고'a'에 대한 업데이트는'b'에서 자동으로 "업데이트"됩니다. – Izkata

+0

나는 주로'B'의 외부에서 접근하는 것이 아니라'B'의 내부에서'a'를 사용하고 싶습니다. 그런 식으로 작동합니까? – nye17

+0

예,'B'의 메소드에'self.foo'를 쓸 때, 파이썬은 속성을 찾기 위해'__getattr__'을 호출 할 것이고 이것은 위의 코드가 실행된다는 것을 의미합니다. –

1

는 (방법을 포함하지 않도록 업데이트) :

class B(object): 
    def __init__(self, a, g): 
     if isinstance(a, A): 
      for k,v in a.__dict__.iteritems(): 
       if not callable(v): 
        self.__dict__[k] = v 
1
class B(object): 
    def __init__(self, a): 
     self.__dict__.update(a.__dict__) 

모범 사례는 isinstance()와 유형을 확인하지만, "오리 입력"을 사용하지 않는 것이 일반적이다. 내가하는 일에 대한 자세한 내용을 모르는 것이므로 isinstance() 수표가 필요한 합법적 인 이유가 있는지 알 수는 없지만 위 코드를 작성하지 않고 작성했습니다.

이것은 A의 인스턴스와 같은 멤버 이름과 B의 인스턴스를 설정하고 그 이름에 바인딩 같은 값 참조와.

+0

Oop에서 오리 타이핑 연습을 생각 나게 해줘서 고마워. 내 소스 코드에서'A'는 실제로 매우 구체적이어서'B'의 정의에서'A' 만 원하기 때문에 여기서 인스턴스 검사를 사용합니다 – nye17

관련 문제