0

指定された少数以外のすべてのインスタンス呼び出しをインスタンスのプロパティに渡す方法はありますか? 以下のように、ラッパークラスを作成する最も簡単な方法を見つけようとしてPyMongoいます。

class Mongo():   
    def __init__(self, db_name, collection_name):
        self.client = MongoClient()
        self.collection = self.client[db_name][collection_name]

という言い方があれば本当にいいですねpass all self.function calls to self.collection unless you are calling something in this list: [__init__, __dict__, etc...]。これを可能にする言語機能はありますか? __call__私が考えることができる唯一のことは、関数名が渡される値になる場所で何かをする__call__ことですが、さまざまな数とタイプのパラメーターを処理する限り、危険にさらされるようです。私は次のようなものを想定しています:

def __call__(self, value, *args, **kargs):
    func = getattr(self.test, value)
    func(self.test, *args, **kargs)

私はまだ上記の作業をしていません。特に、あまりにも多くの引数を渡しています。合格するargs, kargs*args, **kargs、私が望んでいたように自分自身を整理しません。ユーザーが指定した引数を、ユーザーが指定した関数に渡すにはどうすればよいですか? (質問の最後に貼り付けられた完全な最小限の実例)

ただし、上記の動作を取得できたとしても、表記が不格好です。私は本当に次のようなことができるようになりたいです:

f.f1(4,5)

それよりも

f("f1", 4, 5) 

__call__希望どおりに動作させることができたとしても、上記のシナリオに代わるより良い方法はありますか?

動作しないコードは次のとおりです。

class test1():
    def __init__(self, test):
        self.test = test

    def __call__(self, value, *args, **kargs):
        func = getattr(self.test, value)
        func(args, kargs)

class test2():
    def f1(a, b):
        print(a+b)

    def f2(stringy):
        print(stringy)

    def f3(a = 7, b = 14):
        print("a is %d and b is %b"%(a,b))


def main():
    t2 = test2()
    t1 = test1(t2)
    t1("f1",4, 5) #gives an error that I am passing 3 args instead of the 2 specified by func definition

if __name__ == "__main__":
    main()
4

1 に答える 1