IC # 우리는 반사를 통해 그것을합니다. Javascript에서는 다음과 같이 간단합니다.
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
파이썬에서 어떻게합니까?
@property
.
IC # 우리는 반사를 통해 그것을합니다. Javascript에서는 다음과 같이 간단합니다.
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
파이썬에서 어떻게합니까?
@property
.
답변:
for property, value in vars(theObject).iteritems():
print property, ": ", value
드문 경우지만 __slots__
속성이 있으므로 이러한 클래스에는 종종 속성이 없습니다 __dict__
.
__setattr__()
. 사전에 직접 값을 설정하면 객체의 setter 및 / 또는 부모가 무시됩니다. 파이썬에서는 속성 설정 (예 : 위생) 중에 눈에 보이는 것보다 더 많은 일이 백그라운드에서 일어나고,이를 사용하여 setattr()
놓치거나 직접 명시 적으로 처리하도록하는 것이 일반적입니다.
vars()
만 반환합니다 (예 : 객체 속성 및 해당 객체에 등록 된 메소드 ). 동적 멤버 (즉, 해당 오브젝트의 메소드 또는 유사한 마법에 의해 동적으로 정의 된 오브젝트 속성 및 메소드) 는 리턴 하지 않습니다 . 아마도 원하는 속성이 동적으로 정의 되어 또는에 사용할 수 없습니다 . __dict__
__getattr__()
file.ImplementationName
vars()
dir()
참조하십시오 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']
>>>
attributes
대신 용어 를 사용하기 때문에 members
(둘 사이에 차이점이 있습니까?) 파이썬 3.0에서 이름을 수정하여 일관성을 유지할 수있었습니다.
__dict__
합니다.
inspect.getmembers()
마무리 dir()
합니다 . 하품 이요? 가능한 모든 객체 유형을 일반적으로 지원하는 타사 라이브러리에 적합합니다. 그러나 표준 사용 사례의 경우에는 충분합니다. inspect.getmembers()
dir()
dir()
간단한 방법입니다. 여기를 보아라:
dir()
감사합니다.
__dict__
객체 의 속성은 정의 된 다른 모든 속성의 사전입니다. 파이썬 클래스는 getattr 을 무시
하고 속성처럼 보이지만 그렇지 않은 것을 만들 수 있습니다 __dict__
. 또한 내장 기능이있다 vars()
과 dir()
미묘한 방법으로 다르다. 그리고 비정상적인 수업에서 __slots__
대체 할 수 있습니다 __dict__
.
파이썬에서는 객체가 복잡합니다. __dict__
리플렉션 스타일 프로그래밍을 시작하기에 적합한 장소입니다. dir()
대화식 쉘에서 해킹하는 경우 시작하는 곳입니다.
print vars.__doc__
있음을 나타냅니다 With an argument, equivalent to object.__dict__
그래서는 미묘한 차이가 뭘까요?
모든 속성을 반영하려면 위의 답변이 좋습니다.
단순히 사전의 키 (Python의 'object'와 다른 키)를 얻으려면 다음을 사용하십시오.
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
vs. obj.property
) 질문은 객체 속성에 관한 것이 었습니다. 나는 두 사람 사이에 혼란이 있기 때문에 대답을 여기에 넣었습니다.
이것은 다른 답변으로 완전히 다루어 지지만 명시 적으로 설명하겠습니다. 객체에는 클래스 속성과 정적 및 동적 인스턴스 속성이있을 수 있습니다.
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'}
세 가지 방법 모두를 시도 하지만 방법이나 마술은 아닙니다.