Pau*_*han 8 python reflection introspection
我正在Python中编写一些序列化/反序列化代码,它将从某些JSON读取/写入继承层次结构.在发送请求之前,不会知道确切的组成.
所以,我认为在优雅的解决方案,以递归内省Python类层次结构来发射,然后在回来的路上了通过树,在Python基本类型安装正确的价值观.
E.g.,
A
|
|\
| \
B C
Run Code Online (Sandbox Code Playgroud)
如果我把我的"内省"常规上B,它应该返回一个包含所有A的变量,他们的价值观,以及B的变量和它们的值的映射的字典.
现在看来,我可以查看B.__slots__或者B.__dict__,但我只能从那里提取B的变量名称.
我如何获得__slots__/ __dict__A的,因为仅有B?(或C).
我知道python并不像C++那样直接支持转换及其后代 -
Ad *_*Hoc 12
您可以尝试使用type.mro()方法来查找方法解析顺序.
class A(object):
pass
class B(A):
pass
class C(A):
pass
a = A()
b = B()
c = C()
>>> type.mro(type(b))
[<class '__main__.B'>, <class '__main__.A'>, <type 'object'>]
>>> type.mro(type(c))
[<class '__main__.C'>, <class '__main__.A'>, <type 'object'>]
Run Code Online (Sandbox Code Playgroud)
要么
>>> type(b).mro()
Run Code Online (Sandbox Code Playgroud)
编辑:我以为你想做这样的事......
>>> A = type("A", (object,), {'a':'A var'}) # create class A
>>> B = type("B", (A,), {'b':'B var'}) # create class B
>>> myvar = B()
def getvars(obj):
''' return dict where key/value is attribute-name/class-name '''
retval = dict()
for i in type(obj).mro():
for k in i.__dict__:
if not k.startswith('_'):
retval[k] = i.__name__
return retval
>>> getvars(myvar)
{'a': 'A', 'b': 'B'}
>>> for i in getvars(myvar):
print getattr(myvar, i) # or use setattr to modify the attribute value
A Var
B Var
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3481 次 |
| 最近记录: |