创建分层python对象,其中方法的参数来自层次结构

时间:2013-04-05 16:17:58

标签: python class inheritance module

我使用的现有模块包含一个类,该类具有带字符串参数的方法,其形式为:

existing_object.existing_method("arg1")

existing_object.existing_method("arg1:arg2")

参数采用分层结构。 我想创建一个模块,它对参数进行客观化,并使它们成为导入模块类的方法,使得use看起来像这样:

my_object.arg1.my_method()

my_object.arg1.arg2.my_method()

my_method()会调用existing_method(),同时将“arg1:arg2”作为参数传递给它。

如果有人能指出我正确的方向开始,我会很感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

更清楚地思考这一点我意识到我真正想要的是能够使用模块的IPython内省来导航层次结构。这意味着我只需要创建这样的对象:

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

arg1 = Foo("arg1")
arg1.arg2 = Foo("arg1:arg2")