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() 将调用existing_method(),同时将“arg1:arg2”作为参数传递给它。

如果有人能指出我正确的开始方向,我将不胜感激。

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 回答