如何在Python 2.7中动态构造函数的内容?

时间:2012-10-04 19:08:48

标签: python function

我遇到过许多文章,这些文章并没有完全解决我正在尝试做的事情。我希望这不是一个重复的问题。

我正在编写一个Python脚本,它与PC外部的几个真实对象进行交互。我编写了包含与这些对象接口所必需的函数的类。我还成功编写了一个函数,它不是非常面向对象的函数,它实例化这些类的实例,从中获取数据,并将它们全部保存到CSV文件中。一切正常。在我被绊倒的地方是试图使函数更具适应性,这样我每次想要添加另一个类实例或从预先存在的实例获取不同的数据点时都不必重新编写它。

我正在尝试的方法是创建一个列表,其中包含类实例和特定函数名称的名称,以便从这些实例中获取数据。然后我将此列表传递给另一个函数。理想情况下,这个其他函数会为我的CSV文件创建一个标题(这样可以更容易地解释数据),然后继续收集数据。

伪代码:

inst1 = my_class_1()
inst2 = my_class_2()
filename = 'fubar.csv'
control_list = ['inst1', 'value1', 'inst2', 'value']

my_fucntion(filename, control_list):
# Code to create a header for CSV file in the form inst1-value1, inst2-value2
# Loop to control the number of times to grab data
    # Code which iterates control_list and builds up things like inst1.value1(), inst2.value2(),
    # etc. and then appends the results to a list
    # write results list to filename

如果我将control_list的所有元素作为字符串传递给我的函数,我可以轻松地为结果文件生成我的标题,但我无法弄清楚如何获取这些字符串并生成类似inst1.value1()的内容,以便Python将访问我的类中的函数。我想如果我创建像[inst1.value1(), inst2.value2()]这样的列表,我可以从我的类中获取数据,但我无法弄清楚如何以这种方式创建我的头文件。

如果我上面概述的方法不起作用,我会接受其他方法。

3 个答案:

答案 0 :(得分:2)

在oops概念的帮助下,您可以轻松地完成这项工作,而无需使用其他python预定义函数。

类MyClass(对象):     def init (self,value1):         self.value1 = value1

inst = MyClass(“example”)

获取属性的值 inst.value1

设置属性的值 inst.value1 =“你好”

答案 1 :(得分:1)

我认为你正在寻找getattr功能:

class MyClass(object):
    def __init__(self, value1):
        self.value1 = value1

instance = MyClass("example")
fieldname = "value1"
fieldvalue = getattr(inst1, fieldname)
# fieldvalue == "example"

使用getattrsetattr,您可以编写代码来处理您将其名称作为参数传递给函数的字段。

答案 2 :(得分:0)

我最近遇到了类似的问题,并使用namedtuple来解决它。

value1 = 'value of 1'
value2 = 'value of 2'
ControlList = namedtuple("ControlList", "inst1, inst2"))
controllist = ControlList(value1, value2)

>>> print controllist.inst1
... 'value of 1'
>>> print controllist.inst2
... 'value of 2'

value1和value2不一定是字符串,它们甚至可以是instanciated或uninstaciated类。

以这种方式编写ControlList的好处是,您可以随时扩展控件列表,并且它不会破坏依赖于ControlList的特定长度的函数,或者在某些位置具有某些值的函数。您始终可以通过.method绑定访问ControlList中的项目,如果您想避免弄乱代码,可以在函数内部对ControlList.method进行别名。