python中父class字段的重载和包装方法
Overloading and wrapping method of field of parent class in python
例如我有这样的东西:
class A(object):
def __init__(self):
pass
def foo(self, a, b, c):
return a + b + c
class B(object):
def __init__(self):
self.b = A()
def wrapper_func(func):
def wrapper(self, *args, **kwargs):
return func(self, a=3, *args, **kwargs)
return wrapper
class C(B):
def __init__(self):
pass
@wrapper_func
def ???
是否可以在不继承 class 的情况下重载然后包装父 B
class 字段的方法 foo
到 python A
?我确实需要包装器,因为我有具有相同参数的不同方法,但同时我必须保存原始 class B 方法本机(除了重载)。
使用super
初始化C
的父class,然后将所有参数传递给组合class实例的foo
方法A()
通过 继承的 属性 b
的 class C
:
def wrapper_func(func):
def wrapper(self, *args, **kwargs):
kwargs['a'] = 3
return func(self, *args, **kwargs)
return wrapper
class C(B):
def __init__(self):
super(C, self).__init__()
@wrapper_func
def bar(self, *args, **kwargs):
return self.b.foo(*args, **kwargs) # access foo via attribute b
试用:
c = C()
print(c.bar(a=1, b=2, c=3))
# 8 -> 3+2+3
要通过 c.b.foo
、patch c.b.foo
方法和新的 bar
方法调用装饰函数:
class C(B):
def __init__(self):
super(C, self).__init__()
self._b_foo = self.b.foo
self.b.foo = self.bar
@wrapper_func
def bar(self, *args, **kwargs):
return self._b_foo(*args, **kwargs)
试用:
c = C()
print(c.b.foo(a=1, b=2, c=3))
# 8 -> 3+2+3
例如我有这样的东西:
class A(object):
def __init__(self):
pass
def foo(self, a, b, c):
return a + b + c
class B(object):
def __init__(self):
self.b = A()
def wrapper_func(func):
def wrapper(self, *args, **kwargs):
return func(self, a=3, *args, **kwargs)
return wrapper
class C(B):
def __init__(self):
pass
@wrapper_func
def ???
是否可以在不继承 class 的情况下重载然后包装父 B
class 字段的方法 foo
到 python A
?我确实需要包装器,因为我有具有相同参数的不同方法,但同时我必须保存原始 class B 方法本机(除了重载)。
使用super
初始化C
的父class,然后将所有参数传递给组合class实例的foo
方法A()
通过 继承的 属性 b
的 class C
:
def wrapper_func(func):
def wrapper(self, *args, **kwargs):
kwargs['a'] = 3
return func(self, *args, **kwargs)
return wrapper
class C(B):
def __init__(self):
super(C, self).__init__()
@wrapper_func
def bar(self, *args, **kwargs):
return self.b.foo(*args, **kwargs) # access foo via attribute b
试用:
c = C()
print(c.bar(a=1, b=2, c=3))
# 8 -> 3+2+3
要通过 c.b.foo
、patch c.b.foo
方法和新的 bar
方法调用装饰函数:
class C(B):
def __init__(self):
super(C, self).__init__()
self._b_foo = self.b.foo
self.b.foo = self.bar
@wrapper_func
def bar(self, *args, **kwargs):
return self._b_foo(*args, **kwargs)
试用:
c = C()
print(c.b.foo(a=1, b=2, c=3))
# 8 -> 3+2+3