3

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

我正在编写一个 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()]我可以从我的类中获取数据一样,但我无法弄清楚如何以这种方式创建我的头文件。

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

4

3 回答 3

2

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

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

inst = MyClass("示例")

获取属性 inst.value1 的值

设置属性 inst.value1 = "hello" 的值

于 2012-10-05T11:28:19.383 回答
1

我认为您正在寻找以下getattr功能:

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

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

使用getattr并且setattr您可以编写代码来操作您将其名称作为参数传递给函数的字段。

于 2012-10-04T19:33:26.347 回答
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 不必是字符串,它们甚至可以是实例化或非实例化的类。

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

于 2012-10-04T19:25:35.817 回答