2009-08-09 15 views
89

I C# robimy to poprzez odbicie. W języku Javascript jest to proste:Jak wyliczyć właściwości obiektu w Pythonie?

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

Jak to zrobić w Pythonie?

+1

łącząc w ten sposób: [? Jak uzyskać listę metod w klasie Pythona] (http: //stackoverflow.com/questions/1911281/how-do-you-get-list-methods-in-a-python-class) –

Odpowiedz

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

Należy pamiętać, że w niektórych rzadkich przypadkach istnieje własność __slots__ takie zajęcia często nie mają __dict__.

+1

Teraz, jak zmienić wartość? w JavaScript można zrobić: object [property] = newValue. Jak to zrobić w Pythonie? –

+0

Mam to: objectName .__ dict __ [propertyName] = newValue –

+34

zamiast tego użyj setattr(). – Nelson

35

dir() to prosty sposób. Zobacz tutaj:

Guide To Python Introspection

+0

Coś do zapamiętania z dokumentacji Pythona, ponieważ dir() jest dostarczany przede wszystkim jako udogodnienie do użycia w interaktywnym monicie, stara się dostarczyć interesujący zestaw nazw bardziej niż stara się dostarczyć ściśle lub konsekwentnie zdefiniowany zestaw nazw, a jego szczegółowe zachowanie może się zmieniać w różnych wersjach. Na przykład atrybuty metaclass nie znajdują się na liście wyników, gdy argumentem jest klasa._ – skyler

10

Właściwość obiektu __dict__ jest słownikiem wszystkich innych określonych właściwościach. Zauważ, że klasy Python mogą przesłonić getattr i tworzyć rzeczy, które wyglądają jak właściwości, ale nie są w __dict__. Istnieją również wbudowane funkcje, które różnią się subtelnymi sposobami. I __slots__ może zastąpić __dict__ w niektórych niezwykłych klasach.

Obiekty są skomplikowane w Pythonie. __dict__ to właściwe miejsce do rozpoczęcia programowania w stylu refleksji. dir() to miejsce, w którym możesz zacząć hakowanie w interaktywnej powłoce.

+0

'drukuj vars .__ doc__' wskazuje, że' Z argumentem, równoważnym z obiektem .__ dict__' Jakie są zatem subtelne różnice? –

57

Zobacz inspect.getmembers(object[, predicate]).

Powoduje zwrócenie wszystkich elementów obiektu na liście par (nazwa, wartość) posortowanych według nazwy. Jeśli podano opcjonalny argument predykatu, uwzględniane są tylko elementy, dla których predykat zwraca wartość true.

>>> [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'] 
>>> 
+0

Ta odpowiedź jest świetna; nigdy wcześniej nie używał tego modułu. getmembers() jest implementowany przez chodzenie po wynikach dir (object), btw. – Nelson

+0

Czy możesz wyjaśnić, dlaczego jest to lepsze niż dostęp do __dict__? Dokumentacja w Pythonie jest mniej niż pomocna, zwłaszcza, że ​​zwykle używa terminu "attributes" zamiast "members" (czy jest jakaś różnica między tymi dwoma?). Mogli naprawić nazwę w Pythonie 3.0, aby był spójny. – nikow

+0

Ups, oznacza "__dict__', przepraszam. – nikow

8

Georg scholly krótsza wersja

print vars(theObject) 
4

Jeśli szukasz refleksji wszystkich właściwości, odpowiedzi powyżej są świetne.

Jeśli jesteś po prostu chce dostać klucze do obiektu, użyj

my_dict.keys()

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

należy przyjąć odpowiedź – danday74

+0

mimo że jest to moja odpowiedź, nie sądzę, że powinna to być zaakceptowana odpowiedź: klucze obiektu różnią się od właściwości obiektu instancji klasy. Dostęp do nich jest różny ('obj ['key']' vs. 'obj.property'), a pytanie dotyczyło właściwości obiektu. Odpowiadam tutaj, ponieważ między nimi jest łatwe zamieszanie. – MrE

Powiązane problemy