私はこのようなクラスを持っています:
class Tool(object):
def do_async(*args):
pass
非同期メソッドを利用する非非同期メソッドを自動的に生成したい場合:
class Tool(object):
def do_async(*args):
pass
def do(*args):
result = self.do_async(*args)
return magical_parser(result)
各メソッドはオブジェクトとクラス メソッドの両方としてアクセスできる必要があるため、これは特に注意が必要です。これは通常、この魔法のデコレータで実現されます。
class class_or_instance(object):
def __init__(self, fn):
self.fn = fn
def __get__(self, obj, cls):
if obj is not None:
f = lambda *args, **kwds: self.fn(obj, *args, **kwds)
else:
f = lambda *args, **kwds: self.fn(cls, *args, **kwds)
functools.update_wrapper(f, self.fn)
return f
これらのメソッドを作成し、クラス メソッドとオブジェクト メソッドの両方としてアクセスできるようにするにはどうすればよいでしょうか? これはデコレータで実行できるように思えますが、方法がわかりません。
(事前にメソッド名を知っているわけではありませんが、新しい仲間を必要とするすべてのメソッド_async
の名前の末尾にあることは知っています。)
私はかなり近づいたと思いますが、このアプローチは関数をクラス/オブジェクトメソッドとして適切に設定しません:
def process_asyncs(cls):
methods = cls.__dict__.keys()
for k in methods:
methodname = k.replace("_async","")
if 'async' in k and methodname not in methods:
@class_or_instance
def method(self, verbose=False, *args, **kwargs):
response = self.__dict__[k](*args,**kwargs)
result = self._parse_result(response, verbose=verbose)
return result
method.__docstr__ = ("Returns a table object.\n" +
cls.__dict__[k].__docstr__)
setattr(cls,methodname,MethodType(method, None, cls))