使用不同的对象变量调用函数

时间:2014-11-25 21:14:48

标签: python list function object

在Python中,我有一个对象列表,每个对象都有两个变量:

class a_object:
    def __init__(self, input1, input2):
        self.data1=input1
        self.data2=input2

a_list=[]

for i in range(5):
    a_list.append(a_object(i,i+5))

我希望能够使用此列表调用函数,并且该函数将具有一个参数,该参数将确定是对数据1还是数据2执行操作。

例如:

def find_sum(list_name, variable_name):
    total=0
    for i in range(len(list_name)):
        total=total+list_name[i].variable_name
    return total

total1=find_sum(a_list,data1)  #0+1+2+3+4
total2=find_sum(a_list,data2)  #5+6+7+8+9

我可以将variable_name参数设为一个整数,并且每个整数值的if语句中都包含一个函数代码版本,但这种情况要小得多。

2 个答案:

答案 0 :(得分:2)

您可以使用getattr并将属性名称作为字符串传递:

def find_sum(list_name, variable_name):
    total=0
    for i in range(len(list_name)):
        total += getattr(list_name[i], variable_name)
    return total

或者,更简洁一点:

def find_sum(list_name, variable_name):
    return sum(getattr(x, variable_name) for x in list_name)

以下是演示:

>>> class a_object:
...     def __init__(self, input1, input2):
...         self.data1=input1
...         self.data2=input2
...
>>> a_list=[]
>>> for i in range(5):
...     a_list.append(a_object(i,i+5))
...
>>> def find_sum(list_name, variable_name):
...     return sum(getattr(x, variable_name) for x in list_name)
...
>>> find_sum(a_list, 'data1')
10
>>> find_sum(a_list, 'data2')
35
>>>

答案 1 :(得分:2)

  

我希望能够使用此列表调用函数,并且该函数将具有一个参数,该参数将确定是对数据1还是数据2执行操作。

在这种情况下,您不需要名为data1data2的属性,您需要一个名为data的属性,它是一个列表或两个值的其他集合。

属性用于静态引用的内容,使用硬编码到代码中的名称。当你应该使用属性时,你可以告诉你使用了元素,因为你最终不得不在整个地方写spam['eggs']而不是spam.eggs,这很难看。

元素用于动态引用的内容,使用在变量中传递的名称(或索引)。当你应该使用元素时,你可以告诉你使用了属性,因为你最终不得不在整个地方写getattr(spam, 'eggs')而不是spam['eggs'],这甚至更加丑陋。 (或者,对于初学者,你最终甚至不知道如何编写代码 - 但是iCodez's answer解释了如何。)

例如:

class AObject(object):
    def __init__(self, *data):
        self.data = data
    def find_sum(self, values, data_index):
        total=0
        for i in range(len(values)):
            total=total+values[i].data[data_index]
        return total

如果要使用名称而不是索引,请使用dict而不是列表。例如:

def __init__(self, data1, data2):
    self.data = {'data1': data1, 'data2': data2}
def find_sum(self, values, data_name):
    total=0
    for i in range(len(values)):
        total=total+values[i].data[data_name]
    return total

或者可能使用索引,但请将它们命名为:

data1, data2 = 0, 1

(或者,更好的是,使用enum.IntEnum。)

有关详细说明,请参阅Keep data out of your variable namesWhy you don't want to dynamically create variables