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

时间:2018-02-28 01:32:43

标签: python class inheritance methods

如何参数化类的初始化。例如,要将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)

基类是参数吗?

目标是覆盖/向类实例添加其他方法。

更新

感谢@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()

2 个答案:

答案 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()