【问题标题】:Create hierarchical python object where arguments to methods are from hierarchy创建分层python对象,其中方法的参数来自层次结构
【发布时间】:2013-04-05 16:17:58
【问题描述】:

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

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”作为参数传递给它。

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

【问题讨论】:

  • 这两个都是相当奇怪的 API。我认为使用参数列表(在线性层次结构的情况下)或使用列表列表可以更好地处理层次结构。 (另外,my_object.arg1.arg2 在任意参数或非标识符参数的情况下如何工作?)
  • 查看参数的实际示例会有所帮助。
  • 不允许使用任意参数。现有方法的参数格式是非 python 分层接口格式。我想让用户在该层次结构中移动以使用 python 选择选项。结构,然后在最后选择一个简单的方法。

标签: python class inheritance module


【解决方案1】:

您可以使用返回特殊方法调用者实例的自定义 __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

【讨论】:

  • 我想我需要用另一种方式重申这个问题。将编辑问题。
  • 我可能通过称它们为参数而混淆了这种情况。我希望用户能够通过选项卡查看可用选项,因此 arg1 和 arg2 必须是 MyClass() 的属性,my_method 也是如此。参数不需要是未定义的。我很乐意在某个地方定义它们。
  • 啊。在这种情况下,您可以将参数存储在例如嵌套字典结构并在您向下移动时动态添加属性。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多