Jad*_*ias 116 python reflection properties
IC#我们通过反思来做到这一点.在Javascript中它很简单:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Run Code Online (Sandbox Code Playgroud)
怎么用Python做?
Geo*_*lly 136
for property, value in vars(theObject).iteritems():
print property, ": ", value
Run Code Online (Sandbox Code Playgroud)
请注意,在一些罕见的情况下,有一个__slots__属性,这类通常没有__dict__.
gim*_*mel 66
见inspect.getmembers(object[, predicate]).
返回按名称排序的(名称,值)对列表中对象的所有成员.如果提供了可选的谓词参数,则仅包含谓词返回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']
>>>
Run Code Online (Sandbox Code Playgroud)
MrE*_*MrE 11
如果您正在寻找所有属性的反映,上面的答案都很棒.
如果您只是想获取对象的键,请使用
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
Run Code Online (Sandbox Code Playgroud)
其他答案完全涵盖了这一点,但我会明确说明。一个对象可能具有类属性以及静态和动态实例属性。
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
Run Code Online (Sandbox Code Playgroud)
stasis是静态的,dyno是动态的(参见属性装饰器)并且classy是一个类属性。如果我们只是这样做,__dict__或者vars我们只会得到静态的。
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
Run Code Online (Sandbox Code Playgroud)
所以如果我们想要其他人__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}
Run Code Online (Sandbox Code Playgroud)
type带有属性修饰方法(动态属性)的调用将为您提供返回值的类型,而不是method. 为了证明这一点,让我们将 json 字符串化:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
Run Code Online (Sandbox Code Playgroud)
如果它是一种方法,它就会崩溃。
TL;博士。尝试调用extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}所有三个,但不要调用方法或魔法。
| 归档时间: |
|
| 查看次数: |
133463 次 |
| 最近记录: |