获取实例的属性
问题描述:
我想知道是否有方法在Python(2.6)中只获取实例具有的属性的名称。获取实例的属性
比方说,我有:
#!/usr/bin/python2.6
class MyClass(object):
def __init__(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
def x(self, value):
print "Setting x to %s" % (value)
try:
self._x = int(value)
except ValueError:
self._x = None
#main (test area)
if __name__ == '__main__':
a = MyClass()
a.x = "5"
print str(a.x)
print "Vars: %s" %vars(a)
print "Dir: %s" %dir(a)
,输出:
Vars: {'_x': 5}
Dir: ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_x', 'x']
是否有类似的命令为“瓦尔”或“目录”或使会给我“X”而已?
如果不是,你们建议做什么?走“变数”键并移除出现在“_x”前面的“_”?
预先感谢您!
答
您可以使用下面的代码:
def iter_properties_of_class(cls):
for varname in vars(cls):
value = getattr(cls, varname)
if isinstance(value, property):
yield varname
def properties(inst):
result = {}
for cls in inst.__class__.mro():
for varname in iter_properties_of_class(cls):
result[varname] = getattr(inst, varname)
return result
>>> a = MyClass()
>>> a.x = 5
Setting x to 5
>>> properties(a)
{'x': 5}
答
实例没有属性。他们是descriptors,所以他们必须在类工作。 vars(MyClass)
应该返回它。
class MyClass(object):
@property
def x(self):
pass
print vars(MyClass).keys()
打印
['__module__', '__dict__', 'x', '__weakref__', '__doc__']
答
只是增加@ nosklo的贴什么,因为他的速度。
描述符是如何实现属性。
>>> o = MyClass()
>>> print type(o.x)
<type 'NoneType'>
>>> print type(MyClass.x)
<type 'property'>
感谢您的快速答复! 呃......至少我试过的例子,它返回“_x”,但我想得到“x”(莫名其妙) – BorrajaX 2010-12-13 15:08:27
@BorrajaX:什么?不,它返回'x'而不是'_x'。检查我的例子。 – nosklo 2010-12-13 15:11:01
Oooooh!我现在明白了!谢谢! – BorrajaX 2010-12-13 15:11:28