【问题标题】:Inheriting from classes unpacked from a list从列表中解包的类继承
【发布时间】:2015-08-18 10:36:57
【问题描述】:

假设我有一个 Python 中的类对象列表 (A, B, C),我想在构建类 D 时从所有这些对象中继承,例如:

class A(object):
    pass

class B(object):
    pass

class C(object):
    pass


classes = [A, B, C]

class D(*classes):
    pass

不幸的是,我在执行此操作时遇到语法错误。除了写class D(A, B, C),我还能怎么做呢? (在我的实际场景中有不止三个类)

【问题讨论】:

标签: python oop inheritance


【解决方案1】:

您可以使用type 关键字动态创建类,如:

>>> classes = [A, B, C]
>>> D = type('D', tuple(classes), {})
>>> type(D)
<class 'type'>
>>> D.__bases__
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>)

更多示例请参见15247075

【讨论】:

  • 对一个几乎不可能的情况的纯粹敬畏。 +1 :)
【解决方案2】:

一种方法是创建一个装饰器,然后使用type()为我们创建一个新类:

def modify_bases(bases):
    def decorator(cls):
        return type(cls.__name__, tuple(classes), dict(cls.__dict__))
    return decorator
...
>>> %cpaste
@modify_bases(classes)
class D:
    x = 1
    y = 2

>>> D.mro()
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <type 'object'>]

【讨论】:

  • 装饰一个字面上不可能的情况真是太棒了。 +1:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多