IC#我们通过反思来做到。在Javascript中,它很简单:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
如何在Python中完成?
@property
。
IC#我们通过反思来做到。在Javascript中,它很简单:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
如何在Python中完成?
@property
。
Answers:
for property, value in vars(theObject).iteritems():
print property, ": ", value
请注意,在极少数情况下,有一个__slots__
属性,此类通常没有属性__dict__
。
__setattr__()
。直接在字典上设置值会绕过对象的设置器(和/或其父代)。在python中,在属性设置期间(例如卫生),在后台发生的事情多于视线,这是很常见的,使用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
(这两者之间有任何区别吗?)。他们可以在Python 3.0中修复该名称,以使其一致。
__dict__
,抱歉。
inspect.getmembers()
涡卷dir()
与所述(主要是可忽略的)侧的好处(A) ,包括动态类属性和元类的属性和(B)不含成员不匹配所传递的谓词。打哈欠吧? inspect.getmembers()
适用于一般支持所有可能的对象类型的第三方库。但是,对于标准用例来说,dir()
绝对足够。
dir()
是简单的方法。看这里:
dir()
谢谢。
__dict__
对象的属性是其所有其他定义的属性的字典。请注意,Python类可以覆盖getattr
并使内容看起来像属性,而不是in __dict__
。还有一些内置函数vars()
,dir()
它们在微妙的方式上有所不同。并且__slots__
可以代替__dict__
一些不寻常的类。
Python中的对象很复杂。__dict__
是开始进行反射式编程的正确位置。dir()
如果您是在交互式shell中四处乱逛,那么这是一个开始的地方。
print vars.__doc__
表明With an argument, equivalent to object.__dict__
那么细微的差别是什么?
georg scholly短版
print vars(theObject)
如果您正在寻找所有属性的反映,那么上面的答案很好。
如果您只是想获取字典的键(与Python中的“对象”不同),请使用
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'}
这三个方法,但不要调用方法或魔术。