実行時にメソッドのコードを生成する必要があります。任意のコードを実行でき、ドキュメント文字列を持つことができることが重要です。
exec
私はと を組み合わせた解決策を思いつきましたsetattr
。以下はダミーの例です。
class Viking(object):
def __init__(self):
code = '''
def dynamo(self, arg):
""" dynamo's a dynamic method!
"""
self.weight += 1
return arg * self.weight
'''
self.weight = 50
d = {}
exec code.strip() in d
setattr(self.__class__, 'dynamo', d['dynamo'])
if __name__ == "__main__":
v = Viking()
print v.dynamo(10)
print v.dynamo(10)
print v.dynamo.__doc__
同じ結果を達成するための、より優れた、より安全な、より慣用的な方法はありますか?
ベストアンサー1
Theran のコードに基づいていますが、クラスのメソッドに拡張されています。
class Dynamo(object):
pass
def add_dynamo(cls,i):
def innerdynamo(self):
print "in dynamo %d" % i
innerdynamo.__doc__ = "docstring for dynamo%d" % i
innerdynamo.__name__ = "dynamo%d" % i
setattr(cls,innerdynamo.__name__,innerdynamo)
for i in range(2):
add_dynamo(Dynamo, i)
d=Dynamo()
d.dynamo0()
d.dynamo1()
次のように印刷されます:
in dynamo 0
in dynamo 1