クラスメソッドを使用する場合、サブクラスのメソッドを動的に変更するには、メソッドのシグネチャを動的に変更するにはどうすればよいですか?サブクラスでメソッドのシグネチャを動的に変更するにはどうすればよいですか?
例
import inspect
class ModelBase(object):
@classmethod
def method_one(cls, *args):
raise NotImplementedError
@classmethod
def method_two(cls, *args):
return cls.method_one(*args) + 1
class SubClass(ModelBase):
@staticmethod
def method_one(a, b):
return a + b
test = SubClass()
try:
print(inspect.signature(test.method_two))
except AttributeError:
print(inspect.getargspec(test.method_two).args)
私はtest.method_two
がtest.method_one
の署名を取得したいです。親クラスModelBase
を書き換える方法は?
私は約Preserving signatures of decorated functionsを読んでいます。 python3.4 +では、functools.wraps
は装飾された関数の署名を保持するのに役立ちます。私はそれをクラスメソッドに適用したい。
functools.wraps
を使用する場合、装飾されたメソッドの名前を割り当てる必要があります。しかし、この状況でclassmethod
以外の装飾されたメソッドにアクセスする方法はありますか?
from functools import wraps
class ModelBase(object):
@classmethod
def method_one(cls, *args):
raise NotImplementedError
@classmethod
def method_two(cls):
@wraps(cls.method_one)
def fun(*args):
return cls.method_one(*args) + 1
return fun
method_two
包まれた関数を返しますが、私はtest.method_two()(*arg)
でそれを使用する必要があります。この方法は直接ではありません。これは、イントロスペクションの目的のためだけであれば
ありがとうございます!これはCodeGenのためのものです。 method_twoのcodegenを実行するには、method_oneの署名が必要です。 – Ryan