当前位置:  开发笔记 > 编程语言 > 正文

Python超级反射

如何解决《Python超级反射》经验,为你挑选了2个好方法。

如果我有Python代码

class A():
    pass
class B():
    pass
class C(A, B):
    pass

我有课C,有没有办法迭代它的超级分类(AB)?类似伪代码的东西:

>>> magicGetSuperClasses(C)
(, )

一个解决方案似乎是检查模块和getclasstree功能.

def magicGetSuperClasses(cls):
    return [o[0] for o in inspect.getclasstree([cls]) if type(o[0]) == type]

但这是实现目标的"蟒蛇"方式吗?



1> John..:

C.__bases__ 是一个超类的数组,所以你可以像这样实现你的假设函数:

def magicGetSuperClasses(cls):
  return cls.__bases__

但我想cls.__bases__在大多数情况下直接引用会更容易.



2> cdleary..:

@约翰:您的片段不行-你返回的基类(也被称为元类)的.你真的只想要cls.__bases__:

class A: pass
class B: pass
class C(A, B): pass

c = C() # Instance

assert C.__bases__ == (A, B) # Works
assert c.__class__.__bases__ == (A, B) # Works

def magicGetSuperClasses(clz):
  return tuple([base.__class__ for base in clz.__bases__])

assert magicGetSuperClasses(C) == (A, B) # Fails

此外,如果您使用的是Python 2.4+,则可以使用生成器表达式而不是创建列表(通过[]),然后将其转换为元组(via tuple).例如:

def get_base_metaclasses(cls):
    """Returns the metaclass of all the base classes of cls."""
    return tuple(base.__class__ for base in clz.__bases__)

这是一个有点令人困惑的例子,但genexps通常很容易和很酷.:)

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有