私はETL(データ移動)ワークフローのフレームワークであるpetlというパッケージから別のクラスをラップ/デコレート/エンハンスするPythonクラスを作成しています。設計上の制約のため、私はそれをサブクラス化することはできません。すべてのメソッド呼び出しは自分のクラスを介して送られなければならないので、どのようなオブジェクトが返されるかを制御することができます。原則としてこれはプロキシクラスですが、既存の回答/レシピを使用していくつかの問題を抱えています。これは私のコードは次のようになります。プロキシクラスが子のメソッドを呼び出せません
from functools import partial
class PetlTable(object):
"""not really how we construct petl tables, but for illustrative purposes"""
def hello(name):
print('Hello, {}!'.format(name)
class DatumTable(object):
def __init__(self, petl_tbl):
self.petl_tbl = petl_tbl
def __getattr__(self, name):
"""this returns a partial referencing the child method"""
petl_attr = getattr(self.petl_tbl, name, None)
if petl_attr and callable(petl_attr):
return partial(self.call_petl_method, func=petl_attr)
raise NotImplementedError('Not implemented')
def call_petl_method(self, func, *args, **kwargs):
func(*args, **kwargs)
その後、私はテーブルをインスタンス化し、何かを呼び出すようにしてみてください。
これはTypeError: call_petl_method() got multiple values for argument 'func'
を与えます。
これは、位置指定の引数でのみ発生します。 kwargsはうまくいくようです。私はかなりそれがself
と渡されていないとしなければならないと確信していますが、私は解決策が何であるか分かりません。誰かが私が間違ってやっていること、あるいはより良い解決策を考えることができますか?
はpetl'があるだけでなく、どのような 'petl.fromcsv(「のtest.CSV」)'リターンが、どちらもあなたの質問に示すコードで定義されていない、まさに '知るために役立つだろう。 – martineau
活性状態のレシピへのリンクが含まれている[this](http://stackoverflow.com/questions/9942536/how-to-fake-proxy-a-class-in-python)の質問があります。有用な選択肢かもしれない。 –
@martineauフィードバックに感謝します。私は、ライブラリが何であるか、それが何を返すかについてのさらなる情報で質問を更新しましたが、これは本当に 'petl'に特有ではないことを指摘したかっただけです。他のクラスへのパススルーに過ぎません。 – Rob