所以基本上我的问题是这样的。
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
最初在两种情况下都执行相同的逻辑(除了仅更改父类),所以我想使用装饰器来做到这一点。
有可能吗?如果可以,该怎么办?我是否可以通过某种方式将父类作为参数传递?
我将非常感谢我一直困扰我一段时间的答案。
答案 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
当然,您只需为A
和B
定义一个具有call_super_func()
方法的基类,然后再继承它们,就可以消除这样做的需要。