我正在尝试使用数据描述符为类的属性提供一些自定义的get / set功能。我希望能够在运行时检查类并获取该类的数据描述符列表,甚至可以确定描述符的类型。
问题在于,当我查看使用inspect.getmembers
的成员时,我的数据描述符属性已被解析(已调用其__get__
方法,并将结果设置为对象的值)
我正在使用以下示例:http://docs.python.org/2/howto/descriptor.html
import inspect
class RevealAccess(object):
"""A data descriptor that sets and returns values
normally and prints a message logging their access.
"""
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print 'Retrieving', self.name
return self.val
def __set__(self, obj, val):
print 'Updating', self.name
self.val = val
class MyClass(object):
x = RevealAccess(10, 'var "x"')
y = 5
if __name__ == '__main__':
for x in inspect.getmembers(MyClass, inspect.isdatadescriptor):
print x
当我跑步时,我得到:
Retrieving var "x"
('__weakref__', <attribute '__weakref__' of 'MyClass' objects>)
我期待的更像是:
('x', <attribute 'x' of 'MyClass' objects>)
('__weakref__', <attribute '__weakref__' of 'MyClass' objects>)
我知道我错过了一些我无法用手指指的东西。任何帮助表示赞赏。
答案 0 :(得分:3)
要获取描述符本身,您可以查看类__dict__
:
MyClass.__dict__['x']
但更好的方法是修改getter:
def __get__(self, obj, objtype):
print 'Retrieving', self.name
if obj is None: # accessed as class attribute
return self # return the descriptor itself
else: # accessed as instance attribute
return self.val # return a value
给出了:
Retrieving var "x"
('__weakref__', <attribute '__weakref__' of 'MyClass' objects>)
('x', <__main__.RevealAccess object at 0x7f32ef989890>)