我想创建一个子类“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()”,以便它可以选择要继承的正确对象?
答案 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>
>>>
是所希望的。