在python中继承动态对象

时间:2017-07-28 11:14:27

标签: python python-3.x class oop inheritance

我想创建一个子类“sub()”,它可以继承对象“A(对象)”或对象“B(对象)”。

以下内容适用于此:

class A(object):
    def __init__(self):
        print "Class A was inherited"


class B(object):
    def __init__(self):
        print "Class B was inherited"


class sub(A if inh==A else B):
    def __init__(self,inh):
        if inh==A:
            A.__init__(self)
        else:
            B.__init__(self)

但是,当我构造“sub()”时,“inh”不是定义的参数。我希望能够使用参数“inh”构造我的“sub()”,初始化“A(object)”或“B(object)”。

那样:

my_object = sub(inh = A)

会给我:

Class A was inherited

那:

my_object = sub(inh = B)

会给我

Class B was inherited

我的问题是,如何将“inh”传递给构造函数“sub()”,以便它可以选择要继承的正确对象?

2 个答案:

答案 0 :(得分:2)

Immortal的解决方案,虽然基本上是正确的,但有一个缺点:每次调用Sub()都会产生一个新的类,所以像isinstance()或类标识测试这样的东西会破坏。对此的解决方案是保持已创建的类的映射:

_CLSMAP = {}

def Sub(base, *args, **kw):
    if base not in _CLSMAP:
        class Sub(base):
            def __init__(self, *args, **kw):
                super(sub, self).__init__(*args, **kw)
    _CLSMAP[base] = Sub
    return _CLSMAP[base](*args, **kw)

答案 1 :(得分:1)

在我看来,你想要的是一个生成器/工厂函数,它将构建并返回你想要的类实例。 为此,您可以使用python在函数中定义类和函数的能力,以便您在工厂函数的范围内完成class sub的定义,如下所示:

def Sub(inh=object):
    class sub(inh):
       def __init__(self):
           super(sub, self).__init__()
    return sub()

现在,您可以将所需的子类传递给生成器函数,并获取所需类型的实例化实例。

运行输出:

>>> def Sub(inh=object):
...     class sub(inh):
...        def __init__(self):
...            super(sub, self).__init__()
...     return sub()
...
>>> class A(object):
...     def __init__(self):
...         print "Class A was inherited"
...
>>>
>>> class B(object):
...     def __init__(self):
...         print "Class B was inherited"
...
>>>
>>> Sub(A)
Class A was inherited
<__main__.sub object at 0x014E4970>
>>> Sub(B)
Class B was inherited
<__main__.sub object at 0x014E49F0>
>>>

是所希望的。