如何使用参数化的基类初始化包装类别类



如何参数化类的初始化。例如,要包装BaseClass1BaseClass2,可以:

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})

最新更新