问题
I C# we do it through reflection. In Javascript it is simple as:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
How to do it in Python?
回答1:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Be aware that in some rare cases there's a __slots__
property, such classes often have no __dict__
.
回答2:
See inspect.getmembers(object[, predicate]).
Return all the members of an object in a list of (name, value) pairs sorted by name. If the optional predicate argument is supplied, only members for which the predicate returns a true value are included.
>>> [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']
>>>
回答3:
dir() is the simple way. See here:
Guide To Python Introspection
回答4:
The __dict__
property of the object is a dictionary of all its other defined properties. Note that Python classes can override getattr
and make things that look like properties but are not in__dict__
. There's also the builtin functions vars()
and dir()
which are different in subtle ways. And __slots__
can replace __dict__
in some unusual classes.
Objects are complicated in Python. __dict__
is the right place to start for reflection-style programming. dir()
is the place to start if you're hacking around in an interactive shell.
回答5:
georg scholly shorter version
print vars(theObject)
回答6:
If you're looking for reflection of all properties, the answers above are great.
If you're simply looking to get the keys of a dictionary (which is different from an 'object' in Python), use
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
回答7:
This is totally covered by the other answers, but I'll make it explicit. An object may have class attributes and static and dynamic instance attributes.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
is static, dyno
is dynamic (cf. property decorator) and classy
is a class attribute. If we simply do __dict__
or vars
we will only get the static one.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o) #{'stasis': 2}
So if we want the others __dict__
will get everything (and more).
This includes magic methods and attributes and normal bound methods. So lets avoid those:
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}
The type
called with a property decorated method (a dynamic attribute) will give you the type of the returned value, not method
. To prove this let's json stringify it:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
Had it been a method it would have crashed.
TL;DR. try calling extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
for all three, but not methods nor magic.
来源:https://stackoverflow.com/questions/1251692/how-to-enumerate-an-objects-properties-in-python