2011-08-30 9 views
2

그래서 가장 구체적인 클래스에 대해서만 사전/속성 목록을 가져올 수 있습니까? 지금까지 내가 사용하고있다파이썬 클래스 속성이 슈퍼 클래스가 없음

for attr, value in obj.__class__.__dict__.iteritems(): 

그러나 이것도 나에게 슈퍼 클래스에 정의 된 attibutes를 줄 것이다. 이것을 피할 수있는 방법이 있습니까?

답변

3

추출 클래스는 사전 객체에 의해 구현 된 네임 스페이스가있는 python documentation

에서. 클래스 속성 참조는이 사전에서 검색으로 변환됩니다. 예를 들어, Cx는 C .__ dict __ [ "x"]로 변환됩니다 (새 스타일 클래스의 경우 특히 의 다른 방법을 허용하는 여러 가지 후크가 있음). 속성 찾기). 속성 이름이 발견 가 아닌 경우, 속성 검색이 기본 클래스 즉

에 계속 __dict__ 클래스의 "로컬"속성을 포함, 슈퍼 클래스의 속성은 슈퍼 클래스 __dict__에 저장됩니다.

따라서 __class__.__dict__.iteritems()을 사용하여 클래스 속성 만 검색 할 수 있습니다.

1

그것은 나에게 슈퍼 클래스의 속성을 표시하지 않습니다

>>> class A(object): 
    def a(self): 
     print a 
    b = 3 

>>> a = A() 
>>> dir(a) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b'] 
>>> list(a.__class__.__dict__) 
['a', '__module__', 'b', '__dict__', '__weakref__', '__doc__'] 

__module____dict____weakref____doc__는 기본적으로 각 클래스 생성 속성 것으로 보인다. 기본 속성의

이 목록은 이전 스타일 클래스 다릅니다

>>> class B: 
    pass 

>>> list(B().__class__.__dict__) 
['__module__', '__doc__'] 
1

모든 클래스 속성과 상속 클래스를 포함한 그 값의 딕셔너리를 얻고 싶은 경우에, 당신은 다음 코드를 사용 할 수 있습니다 :

cls_dict = { attr: getattr(obj.__class__, attr) 
      for attr in dir(obj.__class__) } 
for attr, val in cls_dict.iteritems(): 
    logging.info("%s = %s", attr, val) 
관련 문제