从Python中的类调用多个函数,而不是每次都重复类名

时间:2012-12-02 18:07:54

标签: python class function syntax with-statement

我觉得这是一个非常简单的问题,但我找不到合适的答案。基本上我有一个名为simulation的类函数调用列表:

simulation.addGroup("teapotarmy")
simulation.populateGroup(20)
simulation.addNode("input",INPUT)
simulation.addNode("output",OUTPUT);
simulation.connectNodes("input","output");
simulation.manipOutputNode("output", "group.xvel");
simulation.manipInputNode("input", 1, 0.05);

有没有办法调用这些函数而不必每次都重复类名?类似的东西:

(thethingIwant) simulation:
    addGroup("teapotarmy")
    populateGroup(20)
    addNode("input",INPUT)
    ...

我已经在其他编程语言中完成了这个,但我还没有想出Python中的语法。我有一个微弱的记忆,它与'with'声明有关...? 提前谢谢。

莱昂

4 个答案:

答案 0 :(得分:6)

简单,不。没有(好的,最后看我的评论)这样做的方法。你能做的最好的事情就是把它分配给另一个更短的名字:

s = simulation
s.addGroup("teapotarmy")
...

这不是太糟糕,虽然我认为正常的方法是更具可读性的方法。

作为一个额外的,你不能这样做严格为真。您可以以编程方式将所有模拟方法分配给本地命名空间,但是,这样做会非常混乱,我建议不要这样做。

示例:

from contextlib import contextmanager
import inspect

class some_class:
    def test(self):
        print("test!")

@contextmanager
def map_to_local(inst, locals):
    methods = inspect.getmembers(inst, inspect.ismethod)
    for name, method in methods:
        locals[name] = method
    yield
    for name, method in methods:
        del locals[name]

inst = some_class()
with map_to_local(inst, locals()):
    test()

注意这是非常脆弱的 - 你必须要小心并做一些事情,比如检查你是不是覆盖了值,在上下文管理器退出之前检查值还没有被删除等等......还不清楚是怎么回事上。

tl;博士:是的,有可能,不,你不应该这样做。您当前的代码很简洁。

答案 1 :(得分:2)

要使用当前设计的现有类,通常的解决方案是使用较短的变量名称:

s = simulation
s.addGroup("teapotarmy")
s.populateGroup(20)
s.addNode("input",INPUT)
s.addNode("output",OUTPUT)
s.connectNodes("input","output")
s.manipOutputNode("output", "group.xvel")
s.manipInputNode("input", 1, 0.05)

也就是说,另一种解决方案是略微改变类以使这些方法返回自我。然后你可以写:

(simulation
    .addGroup("teapotarmy")
    .populateGroup(20) 
    .addNode("input",INPUT)
    .addNode("output",OUTPUT)
    .connectNodes("input","output")
    .manipOutputNode("output", "group.xvel")
    .manipInputNode("input", 1, 0.05))

正常的Python风格是让变异方法返回 None (提供发生变异的提示);但是,返回 self 是您的API的标准,通常会应用一系列转换和状态更新。

答案 2 :(得分:1)

我能想到的最接近的事情是利用Python的函数也是你的类的属性( callable 属性),因此你可以通过名称“获取”它们并调用它们...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Simulation(object):
  def addGroup(self, groupToAdd):
    print "Group to add: %s" % groupToAdd

  def addNode(self, inputType, inputChannel):
    print "My inputs: %s, channel: %s" % (inputType, inputChannel)

if __name__ == "__main__":
  simulation = Simulation()
  functionsToCall = [
      ("addGroup", "teapotarmy"),
      ("addNode", "input", "INPUT"),
    ]
  for functionToCall in functionsToCall:
    getattr(simulation, functionToCall[0])(* functionToCall[1:])

但这可能会让您的代码比以前更加混乱。如果其他人必须修改你的代码,它可能会使他的任务变得复杂......相当多。 :)

了解详情:Callablespacking parameters

答案 3 :(得分:0)

对于您在类中定义的每个方法,您都可以返回self对象。

class schema:
    def __init__(self,name,age):
        self.name = name 
        self.age = age
    def giveName(self):
        print(self.name)
        return self
    def giveAge(self):
        print(self.age)
        return self

obj = schema(name="yo",age=15)
obj.giveName().giveAge()