使用函数在类中设置列表名称

时间:2011-10-05 12:37:22

标签: python oop

我有一个从CSV文件导入数据的类,以及一个采用文件名和输出列表名称的函数。我想使用self.info函数将self.data_name的名称设置为setattr()。我怎么能这样做?

import csv

class import_data:

    def import_csv(self, filename_csv, data_name):


            setattr(self,data_name,0)

            datafile = open(filename_csv, 'r')
            datareader = csv.reader(datafile)
            self.data_name = []

            for row in datareader:
                self.data_name.append(row)
            print("finished importing data")

b = import_data()
b.import_csv('info.csv', 'info')
print(b.info)

这不起作用,因为b.data_name不是b.info。这会打印0而不是导入的CSV文件。

2 个答案:

答案 0 :(得分:2)

试试这个:

class import_data:
    def import_csv(self, filename_csv, data_name):
        with open(filename_csv, 'r') as f:
            setattr(self, data_name, list(csv.reader(f)))
        print("finished importing data")

答案 1 :(得分:0)

您需要通过调用self.data_nameimport_csv()替换setattr()函数中getattr()所有用法能够使用动态名称。

使用self.data_name将使用名为data_name的成员,因为我怀疑您已经意识到,这不是您想要做的。

例如,请尝试以下操作:

class import_data:
    def import_csv(self, filename_csv, data_name):

            #set dynamic named item to default value
            #not required if this will happen anyway (in this example it does)
            setattr(self,data_name,[])  

            #preparation activities
            datafile = open(filename_csv, 'r')
            datareader = csv.reader(datafile)

            #do required work using a temporary local variable
            temp = []
            for row in datareader:
                temp.append(row)

            #copy the temporary local variable into the dynamically named one
            setattr(self, data_name, temp)

            #tidy up activities
            datafile.close()
            print("finished importing data")

请务必查看eumiro的答案,该答案使用withlist()对您的特定问题采用更好,更紧凑和更Pythonic的方法。但是,上述内容应该有助于说明如何在更广泛的案例中使用setattr()