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']
>>>
답변
답변
__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'}
세 가지 방법 모두를 시도 하지만 방법이나 마술은 아닙니다.