在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语句中都包含一个函数代码版本,但这种情况要小得多。
答案 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执行操作。
在这种情况下,您不需要名为data1
和data2
的属性,您需要一个名为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 names和Why you don't want to dynamically create variables。