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

3
我看过很多文章,但它们没有完全解决我所需求的问题。希望这不是一个重复的问题。
我正在编写一个Python脚本,它与我个人电脑之外的几个真实世界对象进行交互。我编写了包含必要函数以与这些对象进行交互的类。我也成功编写了一个函数(风格上不太面向对象),它实例化那些类的实例,从它们获取数据,并将所有数据保存到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()]这样的列表,就可以从我的类中获取数据,但我无法用这种方式创建我的标题文件。如果上述方法不起作用,我也可以尝试其他方法。

1
你为什么要传递字符串而不是类本身呢?这样你就可以实例化类,无论传入的是哪个类。 - Gareth Latty
我可能没有清楚地表达我的伪代码。我试图传递类的实例。我想能够访问这些实例的名称(作为我的数据头的字符串)并且还能够访问这些实例的方法以获取我的数据。传递字符串只是我尝试的一种方法,以便我可以轻松创建我的标题。我希望使用这些字符串来访问我的实例上的方法。正如我之前所说,我愿意尝试其他方法。 - user1721015
3个回答

2

您可以通过面向对象编程的思想轻松完成此任务,而无需使用其他Python预定义函数。

类示例:

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

实例化:

inst = MyClass("example")

获取属性值:

inst.value1

设置属性值:

inst.value1 = "hello"


1

我想你正在寻找getattr函数:

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

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

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

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到您的函数。


这看起来很有前途,但根据您的示例,我不太明白如何将其应用到我的情况中。我需要更多地研究namedtuple来弄清楚我是否可以使用它以及如何使用它。 - user1721015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接