如何参数化类的初始化。例如,要将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)
基类是参数吗?
目标是覆盖/向类实例添加其他方法。
更新
感谢@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()
答案 0 :(得分:0)
您可以使用元类:
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})
答案 1 :(得分:0)
您可以在函数内的运行时动态创建一个类:
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()