1

次の形式をとる文字列引数を持つメソッドを持つクラスを含む、私が使用する既存のモジュールがあります。

existing_object.existing_method("arg1")

また

existing_object.existing_method("arg1:arg2")

引数は階層構造になっています。引数をオブジェクト化し、それらをインポートされたモジュールのクラスのメソッドにして、使用が次のようになるモジュールを作成したいと思います。

my_object.arg1.my_method()

また

my_object.arg1.arg2.my_method()

my_method() は、「arg1:arg2」を引数として渡しながら、existing_method() を呼び出します。

誰かが私を正しい方向に向けて始めることができれば、私はそれを感謝します.

4

2 に答える 2

3

__getattr__特別なメソッド呼び出し元インスタンスを返すカスタムでこれを行うことができます:

class MethodCaller(object):
    def __init__(self, args, parent):
        self.args = args
        self.parent = parent
    def __getattr__(self, name):
        return MethodCaller(self.args + (name,), self.parent)
    def my_method(self):
        return self.parent.existing_method(':'.join(self.args))

class MyClass(object):
    def __getattr__(self, name):
        return MethodCaller((name,), self)
    def existing_method(self, arg):
        print arg

例:

>>> MyClass().arg1.my_method()
arg1
>>> MyClass().arg1.arg2.my_method()
arg1:arg2
>>> MyClass().foo.bar.my_method()
foo:bar
于 2013-04-05T16:30:21.317 に答える
0

これについてより明確に考えると、私が本当に望んでいたのは、モジュールの IPython イントロスペクションを使用して階層をナビゲートできるようにすることであることに気付きました。つまり、次のようなオブジェクトを作成するだけで済みます。

class Foo():
    def __init__(self, arg):
        self.arg = arg
    def my_method(self.arg)

arg1 = Foo("arg1")
arg1.arg2 = Foo("arg1:arg2")
于 2013-04-08T21:45:41.230 に答える