我觉得这是一个非常简单的问题,但我找不到合适的答案。基本上我有一个名为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'声明有关...? 提前谢谢。
莱昂
答案 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:])
但这可能会让您的代码比以前更加混乱。如果其他人必须修改你的代码,它可能会使他的任务变得复杂......相当多。 :)
了解详情:Callables,packing 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()