如果我有Python代码

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

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

>>> magicGetSuperClasses(C)
(<type 'A'>, <type 'B'>)

一种解决方案似乎是检查模块getclasstree功能。

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

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

===============>>#1 票数:36 已采纳

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

def magicGetSuperClasses(cls):
  return cls.__bases__

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

===============>>#2 票数:11

@约翰:您的片段不行-你返回的基类(也被称为元类)的。 你真的只想要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+,则可以使用生成器表达式而不是创建列表(通过[]),然后将其转换为元组(通过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通常很容易和很酷。 :)

===============>>#3 票数:4

检查模块是一个好的开始,使用getmro函数:

以方法解析顺序返回类cls基类的元组,包括cls。 在这个元组中没有类出现过多次。 ...

>>> class A: pass
>>> class B: pass
>>> class C(A, B): pass
>>> import inspect
>>> inspect.getmro(C)[1:]
(<class __main__.A at 0x8c59f2c>, <class __main__.B at 0x8c59f5c>)

返回元组的第一个元素是C ,你可以忽略它。

===============>>#4 票数:2

如果您需要知道订购哪个super()会调用类,您可以使用C.__mro__ ,因此不需要inspect

  ask by jelovirt translate from so

未解决问题?本站智能推荐:

4回复

Python反射

假设我们在内存中有很多对象。 每个人都有一个独特的身份。 如何迭代内存以查找与某个id进行比较的特定对象? 抓住它并通过getattr使用它?
4回复

Python反射和可调用对象

我有两个问题。 如何创建对象'Two'? constr()或c()都不起作用; 似乎apply将它变成了一种类型。 将类和实例传递给方法时会发生什么?
4回复

Python代码反射和修改

也许我没有使用正确的术语,但我正在寻找一段Python代码(在Python中),获取代码的标记树,进行某种修改,并将其重新组装到Python。 例如,考虑这段代码: 我希望能够采取这种方式并以编程方式执行此操作: 我无法想象没有一个库可以做到这样的事情。 提前致谢。
3回复

Python反射和类型转换

在Python中,str(),int(),float()等函数通常用于执行类型转换。 但是,这些要求您在开发时知道要转换为哪种类型。 我尝试编写的一些Python代码的子问题如下: 给定两个变量foo和bar ,找到foo的类型。 (在开发时还不知道,因为这是通用代码。)然后,尝试将
2回复

python反射找到引用对象

如果我有以下代码 给我一个对contained_object的引用,是否可以通过反射来确定它和引用它的对象是否具有相同的scope ? 谢谢 编辑:很抱歉,如果问题不清楚,我不太确定如何用python术语询问它。 我设计了一种样本 一个例子可能是
1回复

调用超级初始化的python装饰器

我试图做一个装饰器,它会自动调用父类的init。 它适用于单一继承,但是当我尝试链接效果时,出现堆栈溢出错误。 谁能解释(a)为什么会发生这种情况,以及(b)如何完成我想完成的工作?
1回复

Python2反射:__import __()的奇怪行为

我需要一个通用脚本,该脚本以some_module.function作为参数并执行它。 我为此编写了一个解决方案(必须与Python-2.4兼容...): 我的问题是: 为什么我必须在__import__()之后执行getattr() __import__() ? 事实证明
3回复

使用Python反射性地获取字段名称

是否有可能在Python(3.2)中反映出一个字段的名称? 请参阅以下示例: validator.max(self.x, 10)应该生成一条错误消息,其中包含字段x的名称作为字符串(在本例中为"x" )。
3回复

Python:采用反射的Web服务方法

美好的一天! 我尝试使用反射来进行Web服务的方法。 这是代码示例: 请帮助我了解如何使用方法名称应用该方法? 谢谢!
1回复

Python中的反射:如何在Python 2.7中查看函数的所有参数

我正在寻找一种方法来将函数的参数放入包含其名称的dict中,默认值为any。 我已经看到inspect模块有一个getcallargs函数,但它可以引发异常,并且如果被检查函数需要,则需要提供参数。 我正在寻找能够在不事先了解函数的情况下访问此结果的内容。 这必须与python 2