2010-12-21 4 views
2

의 우리가이 수업을 가정 해 봅시다 :부모로부터 속성을 얻는 방법?

class Foo(object): 
    _bar = "" 

    def __init__(self): 
     self.bar = "hello" 

    def getBar(self): 
     return self._bar 

    def setBar(self, bar): 
     self._bar = bar 

    def getAttributes(self): 
     for attr in self.__dict__: 
      print attr 

    bar = property(getBar, setBar) 

class Child(Foo): 

    def __init__(self): 
     super(Child, self).__init__() 
     self.a = "" 
     self.b = "" 

을 내가 좋아하는 뭔가를 할 경우 :

child = Child() 
child.getAttributes() 

내가 부모와 자식의 모든 특성을 얻을. 부모로부터 속성을 어떻게 얻을 수 있습니까?

미리 감사드립니다.

+0

자식을 통해 Foo 클래스의 getAttributes를 호출하려고합니까 ?? –

+2

'Foo.getAttributes()'를 호출하지 않는 이유는 무엇입니까? – John

+0

예입니다. 제 실제 프로그램에서는 많은 수업이 주 수업에서 연장됩니다.이러한 클래스의 변수 목록이 있지만 부모로부터 속성에 액세스하고 싶습니다. 그래서 예를 들어 getAttributes를 호출합니다. 어떤 클래스인지 모르겠습니다. – bribon

답변

1

빠른 예 (이 월, 또는 당신이 원하는하지) :

child.__class__.__bases__[0]().getAttributes() 

편집이 : 일 조금을 명확히하기 : __base__이 클래스에 대한 기본 클래스의 튜플을 포함하는 클래스의 속성입니다. 자식 클래스에는 하나의 기본 클래스 Foo 만 있으므로이 튜플의 첫 번째 요소를 선택하기 만하면됩니다. 입력으로 데이터를 사용하면, 생성 할 것이다하십시오 Child 인스턴스를 호출하는

def getAttributes(self): 
    for attr in self.__class__.__bases__[0].__dict__: 
     print attr 

그러면 얻을 것이다 다음과 같은 결과 :

>>> child.getAttributes() 
a 
_bar 
b 

>>> child.__class__.__bases__[0]().getAttributes() 
_bar 
+0

효과가 없습니다. 나는 dir (child .__ class__)을 수행했고 내장 함수를 보지 못했습니다. – bribon

+0

@bribon : * __ bases__ * 속성은 * dir() * AFAIK –

+0

에 의해보고되지 않습니다. 어쩌면 내가 오해 한 것일 수도 있습니다. '_bar'라는 이름을 찾기 위해'__bases__ '를 사용하는 두 번째 구조가 수퍼 클래스의 * 클래스 속성만을 나열하고 수퍼 클래스의'__init__'에 설정된 인스턴스 속성은 명부? 예를 들어 : 당신은'bar'를 출력하지 않고, 부모 클래스의 인스턴스의 속성이기 때문에 필요하다고 생각했습니다. –

3

수 없습니다. 파이썬은 모든 객체 속성을 "객체 상에"동일한 위치에 저장합니다. 그것들을 상속 계층에서 클래스 당 하나씩 분리 된 저장 영역으로 분리하지는 않습니다. 여러분이 할 수있는 최선의 방법은 모든 레벨에 속한 __slots__ = [] 선언을 사용하거나 덜 정식 인 속성 이름 목록을 유지 한 다음 getattr() 내부 루프를 사용하여 각 레벨에 속한 속성 목록을 유지하는 것입니다 (또는 객체의 __dict__에서 직접 보이는 루프)를 사용하여 특정 속성 집합을 가져옵니다.

이 속성 목록으로 무엇을하려고합니까? 그들과 함께 무엇을하고 싶니? 더 큰 문제를 해결할 더 좋은 방법이 있을지도 모릅니다.

+0

+1, 바로 대답. –

+0

나는 각 클래스의 모든 속성을 렌더링하기 위해 __dict__를 사용하는데, 각 속성을 하나씩 호출하지 않고 모든 객체의 내용으로 XML 또는 JSON을 만들 수 있습니다. 나는 다른 접근법을 가지고 있지만 도움은 매우 유용합니다. 감사합니다! – bribon

0

는 당신이 class FoogetAttributes() 방법을 변경하는 경우 :

child = Child() 
child.getAttributes() 
# setBar 
# __module__ 
# bar 
# getAttributes 
# __dict__ 
# __doc__ 
# __weakref__ 
# _bar 
# __init__ 
# getBar 
2

"부모로부터 속성을 어떻게 얻을 수 있습니까?"

정말 "부모"가 없습니다. Child (Foo)는 클래스이므로 Foo는 여기에있는 "부모"이지만 (일반적으로 "수퍼 클래스"라고 부르기는하지만), 그 관계는 인스턴스로 이어지지 않습니다.

child = Child()으로 클래스를 인스턴스화하면 child에는 부모가 없습니다. 모든 속성은 인스턴스에 직접 배치되므로 실제로 상위가 없습니다. 이것이 문제가되는 이유입니다. 그러나 Brandon이 제안한 것처럼 슬롯을 사용하거나 어떤 속성이 어떤 수퍼 클래스에 속하는지 정의함으로써 특정 클래스에 정의 된 것을 반환 할 수 있습니다.

왜 지구상에 너는 나를 넘어야 할까? :)

관련 문제