问题1
您将方法包装器实现为可自定义调用的,而不是普通的函数对象。这意味着您必须实现
__get__()
自己将函数转换为方法的描述符。(如果您使用了一个函数,则它已经存在。)
from types import MethodType
class Dec:
def __init__(self, f):
self.f = f
def __call__(self, *a, **kw):
return self.f(*a, **kw)
def __get__(self, obj, objtype=None):
return self if obj is None else MethodType(self, obj)
class Foo:
@Dec
def opt1(self, text):
return 'foo' + text
>>> Foo().opt1('two')
'footwo'
Descriptor HowTo Guide
问题2
可赎回的
option_decorator
实例替换
OptionClass
这意味着改变可调用实例会影响
光学类
使用可调用对象的。确保这是您想要做的,因为如果您想要定制每个实例的方法,您将不得不以不同的方式构建它。
class OptionClass(object):
"""defines a bunch of options"""
@option_decorator
def option_1(self,test_text):
return("option {}".format(test_text))
option_1.set_name('foo')
问题3
这个
__call__
示例中的方法不返回函数。它正在返回
结果
的
function_ptr
召唤。但是如果您使用
async def
yield
将函数转换为返回生成器对象的函数。