如何参数化类的初始化。例如,要包装BaseClass1
和BaseClass2
,可以:
class BaseClass1:
pass
class BaseClass2:
pass
class Wrapper(BaseClass1):
def __init__(self):
pass
def new_method(self):
return 1
w = Wrapper()
如何对其进行参数化,以便在初始化时可以选择基类?
例如,如何使用:
初始化Wrapper
类 w1 = Wrapper('BaseClass1')
w2 = Wrapper('BaseClass2')
或:
b1 = BaseClass1
w1 = Wrapper(b1)
b2 = BaseClass2
w2 = Wrapper(b2)
或:
w1 = Wrapper(BaseClass1)
w2 = Wrapper(BaseClass2)
基类是一个参数?
目的是覆盖/添加其他方法。
update
感谢@Serge Ballesta发布答案,如何扩展答案,以便新方法可以访问基类属性?例如:
class Base:
def __init__(self):
self.id = 1
def Wrapper(x):
class _wrap(x):
def __init__(self):
pass
def new_method(self):
return self.id
return _wrap
instance.new_method()
将在以下代码中返回1:
instance = Wrapper(Base)()
instance.new_method()
您可以在函数中的运行时间动态创建类:
def Wrapper(x):
class _wrap(x):
def __init__(self):
pass
def new_method(self):
return 1
return _wrap
您可以正常使用它:
W1 = Wrapper(BaseClass1)
W2 = Wrapper(BaseClass2)
w1 = W1()
w2 = W2()
您可以使用元素:
class BaseClass1:
def d1(self):
print(1)
class BaseClass2:
def d2(self):
print(2)
def make_class(base):
return type('MyClass', (base,), {})
MyClass1 = make_class(BaseClass1)
MyClass2 = make_class(BaseClass2)
c1 = MyClass1()
c2 = MyClass2()
c1.d1() # 1
c2.d2() # 2
如果您想拥有生成类的常见属性,则可以使用以下方式:
def make_class(base):
def new_method(...):
...
return type('MyClass', (object, ),
{'common_attr:1,
'new_method': new_method})