[python] 파이썬에서 객체의 속성을 열거하는 방법은 무엇입니까?

IC # 우리는 반사를 통해 그것을합니다. Javascript에서는 다음과 같이 간단합니다.

for(var propertyName in objectName)
    var currentPropertyValue = objectName[propertyName];

파이썬에서 어떻게합니까?



답변

for property, value in vars(theObject).iteritems():
    print property, ": ", value

드문 경우지만 __slots__속성이 있으므로 이러한 클래스에는 종종 속성이 없습니다 __dict__.


답변

참조하십시오 inspect.getmembers(object[, predicate]).

이름별로 정렬 된 (이름, 값) 쌍 목록에서 객체의 모든 멤버를 반환합니다. 선택적 술어 인수가 제공되면 술어가 참 값을 리턴하는 멤버 만 포함됩니다.

>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__',    '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>> 


답변

dir()간단한 방법입니다. 여기를 보아라:

파이썬 내부 검사 안내서


답변

__dict__객체 의 속성은 정의 된 다른 모든 속성의 사전입니다. 파이썬 클래스는 getattr 을 무시
하고 속성처럼 보이지만 그렇지 않은 것을 만들 수 있습니다 __dict__. 또한 내장 기능이있다 vars()dir()미묘한 방법으로 다르다. 그리고 비정상적인 수업에서 __slots__대체 할 수 있습니다 __dict__.

파이썬에서는 객체가 복잡합니다. __dict__리플렉션 스타일 프로그래밍을 시작하기에 적합한 장소입니다. dir()대화식 쉘에서 해킹하는 경우 시작하는 곳입니다.


답변

게오르그 scholly 짧은 버전

print vars(theObject)


답변

모든 속성을 반영하려면 위의 답변이 좋습니다.

단순히 사전의 키 (Python의 ‘object’와 다른 키)를 얻으려면 다음을 사용하십시오.

my_dict.keys()

my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']


답변

이것은 다른 답변으로 완전히 다루어 지지만 명시 적으로 설명하겠습니다. 객체에는 클래스 속성과 정적 및 동적 인스턴스 속성이있을 수 있습니다.

class foo:
    classy = 1
    @property
    def dyno(self):
        return 1
    def __init__(self):
        self.stasis = 2

    def fx(self):
        return 3

stasis정적 dyno이며 동적이며 (속성 데코레이터 참조) classy클래스 속성입니다. 우리가 단순히 그렇게 __dict__하거나 vars정적 인 것만 얻는다면.

o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}

우리가 원한다면 다른 사람들 __dict__이 모든 것을 얻을 것입니다. 여기에는 매직 메소드와 속성 및 노멀 바운드 메소드가 포함됩니다. 따라서 피하십시오 :

d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}

type속성 장식 방법 (동적 속성)로 호출, 당신에게 반환 된 값의 유형을하지 줄 것이다 method. 이것을 증명하기 위해 json을 문자열 화하십시오.

import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}

그것이 추락했을 방법이었습니다.

TL; DR. extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}세 가지 방법 모두를 시도 하지만 방법이나 마술은 아닙니다.