【发布时间】:2021-12-29 09:13:58
【问题描述】:
我有一个类有一堆看起来相似的方法,例如:
class Foo(object):
def __init__(self, delegate= None):
self.delegate = delegate
def some_method(self):
if self.delegate:
return self.delegate.some_method()
return "this is some other value"
我的想法是这样的包装器:
def use_delegate(fun):
def wrap(self, *args):
if self.delegate:
return fun(self.delegate, *args)
return fun(self, *args)
return wrap
class Foo(object):
def __init__(self, delegate= None):
self.delegate = delegate
@use_delegate
def some_method(self):
return "this is some other value"
问题来了:如果“self.delegate”是Foo的子类,则调用了错误的方法:
class Bar(Foo):
def some_method(self):
return "This is the output I want"
>>> bar = Bar()
>>> bar.some_method()
'This is the output I want'
>>> foo= Foo(bar)
>>> foo.some_method()
'this is some other value'
到目前为止,我发现这是可行的,但它看起来真的很丑:
def use_delegate(fun):
def w(self, *args):
if self.delegate:
return self.delegate.__getattribute__(fun.__name__)(*args)
return fun(self, *args)
return w
我想知道是否有更好的方法来完成同样的事情。
【问题讨论】:
-
为什么要包装实例
delegate而不是直接使用呢?这看起来像是一个设计问题。 -
确实,我怀疑我的设计很糟糕,我必须考虑一下,但我仍然认为它是一个很好的编程难题。
标签: python oop python-decorators