Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用不同的对象变量调用函数_Python_List_Function_Object - Fatal编程技术网

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

Python 使用不同的对象变量调用函数,python,list,function,object,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)) 我希望能够用这个列表调用一个函数,这个函数将有一个参数来决定是对data1还是data2执

在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))
我希望能够用这个列表调用一个函数,这个函数将有一个参数来决定是对data1还是data2执行操作

例:

我可以将变量名参数设置为整数,并将函数代码的版本包含在每个整数值的if语句中,但这就不那么一般了。

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

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
>>>
可以使用属性名称并将其作为字符串传递:

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
>>>
我希望能够用这个列表调用一个函数,这个函数将有一个参数来决定是对data1还是data2执行操作

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

属性用于静态引用的对象,使用硬编码到代码中的名称。你可以看出你在应该使用属性的时候使用了元素,因为你最终不得不写
spam['egs']
,而不是
spam.egs
,这很难看

元素用于动态引用的对象,使用在变量中传递的名称(或索引)。你可以知道你在应该使用元素的时候使用了属性,因为你最终不得不写
getattr(spam'eggs')
而不是
spam['eggs']
,这更难看。(或者,对于新手来说,你一开始甚至不知道如何编写代码,但会解释如何编写。)

例如:

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
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
如果要使用名称而不是索引,请使用dict而不是列表。例如:

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
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

有关详细说明,请参阅和

我希望能够用这个列表调用一个函数,这个函数将有一个参数来决定是对data1还是data2执行操作

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

属性用于静态引用的对象,使用硬编码到代码中的名称。你可以看出你在应该使用属性的时候使用了元素,因为你最终不得不写
spam['egs']
,而不是
spam.egs
,这很难看

元素用于动态引用的对象,使用在变量中传递的名称(或索引)。你可以知道你在应该使用元素的时候使用了属性,因为你最终不得不写
getattr(spam'eggs')
而不是
spam['eggs']
,这更难看。(或者,对于新手来说,你一开始甚至不知道如何编写代码,但会解释如何编写。)

例如:

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
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
如果要使用名称而不是索引,请使用dict而不是列表。例如:

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
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


有关详细说明,请参见和。

a类对象??这有效吗?好吧,假设
input1
input2
是全局变量,其值符合
类型
协议,而
self
是一个带有
\uu dict\uuuu
的全局变量,这是有效的,但它并不完全正确useful@gosom-我认为OP发布了伪代码。我编辑了他的答案,使其具有正确的语法。感谢您修复该问题。class a_对象??这有效吗?好吧,假设
input1
input2
是全局变量,其值符合
类型
协议,而
self
是一个带有
\uu dict\uuuu
的全局变量,这是有效的,但它并不完全正确useful@gosom-我认为OP发布了伪代码。我对他的答案进行了编辑,以使其具有正确的语法。谢谢您的修复。您可以这样做,但您可能不应该这样做。我承认,您的答案更清晰。:)不过我发布了这个解决方案,因为我不知道OP是否可以/想要使用
find\u sum
方法。如果情况并非如此,并且他需要动态访问属性,那么他将被困在
getattr
中。我确实链接到了您的答案,以了解适合的情况。但是很多人在他们不应该的时候问这个问题,所以我认为涵盖这一部分很重要。你可以这样做,但你可能不应该。我承认,你的答案更清楚。:)不过我发布了这个解决方案,因为我不知道OP是否可以/想要使用
find\u sum
方法。如果情况并非如此,并且他需要动态访问属性,那么他将被困在
getattr
中。我确实链接到了您的答案,以了解适合的情况。但是很多人在不应该的时候问这个问题,所以我认为这一部分很重要。