用一个装饰器调用不同的父类方法

时间:2018-11-18 20:37:38

标签: python inheritance decorator python-decorators

所以基本上我的问题是这样的。

class A():
    def func(self):
        return 3

class B():
    def func(self):
        return 4

class AA(A):
    def func(self):
        return super(AA, self).func

class BB(B):
    def func(self):
        return super(BB, self).func

func函数正在做一些工作,其作用之一就是从其父类获取一些属性(或运行方法或其他)。

由于func最初在两种情况下都执行相同的逻辑(除了仅更改父类),所以我想使用装饰器来做到这一点。

有可能吗?如果可以,该怎么办?我是否可以通过某种方式将父类作为参数传递?

我将非常感谢我一直困扰我一段时间的答案。

2 个答案:

答案 0 :(得分:1)

无需使用super来访问父类的数据属性。

为了访问数据属性,类也不需要父级。

您可以使用mixin来完成这项工作:

# A and B stay the same - they still have a c attribute
class A():
    c = 3

class B():
    c = 4  # I've changed B to make it clear below

#Instead have a mixin which defines func()
class Mixin:
    def func(self):
        # func has its behaviour here
        return self.c

class AA(Mixin, A):
    pass
class BB(Mixin, B):
    pass

a = AA()
b = BB()
print(a.func())
print(b.func())

输出:

3
4

答案 1 :(得分:0)

您可以使用单个类装饰器来执行此操作,方法是在其中定义一个通用方法以执行所需的操作,然后将其添加到要装饰的类中。这就是我的意思:

def my_decorator(cls):
    def call_super_func(self):
        return super(type(self), self).func()

    setattr(cls, 'call_super_func', call_super_func)
    return cls

class A():
    def func(self):
        print('in A.func')
        return 3

class B():
    def func(self):
        print('in B.func')
        return 4

@my_decorator
class AA(A):
    def func(self):
        print('in AA.func')
        return self.call_super_func()

@my_decorator
class BB(B):
    def func(self):
        print('in BB.func')
        return self.call_super_func()


aa = AA()
aa.func()
bb = BB()
bb.func()

输出:

in AA.func
in A.func
in BB.func
in B.func

当然,您只需为AB定义一个具有call_super_func()方法的基类,然后再继承它们,就可以消除这样做的需要。