在迭代器创建时保存实例 - Python
Saving instances when created by an iterator - Python
我想使用迭代器生成 class 的多个实例,但我也希望能够为在此过程中创建的每个单独实例分配一个变量。有没有办法做到这一点?下面是我当前的代码,结果是我能够打印我希望访问的数据,但是每次迭代时创建的对象都会被覆盖。理想情况下,我想为从迭代器生成的每个字典分配单独的变量,以便我可以对它们应用其他函数。因此,如果电子表格包含 3 行中的数据,那么我将有 3 个不同的 layerObject,而不是最后只有一个 layerObject。如果不预先定义将要创建的对象的数量,我似乎无法弄清楚如何做到这一点,但是我希望它保持足够的灵活性,以便它可以生成(并保存)与行数一样多的对象数据。有办法吗?
import openpyxl
layerFile = openpyxl.load_workbook('\xxx/xxx/xxx.xlsx')
layerSheet = layerFile.get_sheet_by_name('Sheet1')
class Layer:
def __init__(self, layerNumber):
#initialize list to hold layer data
self.layerData = []
self.keyFields = []
#read layer attribute data from excel file
for columns in range(1, layerSheet.get_highest_column()+1):
cellData = layerSheet.cell(row = layerNumber + 1, column = columns).value
cellFields = layerSheet.cell(row = 1, column = columns).value
self.layerData.extend([cellData])
self.keyFields.extend([cellFields])
#creates dictionary that contains layer information
def layerContainer(self):
self.layerContainer = dict(zip(self.keyFields, self.layerData))
return self.layerContainer
#reads the file for all layers in the excel file and creates
for rows in range(1, layerSheet.get_highest_row()+1):
layerObject = Layer(rows)
print(layerObject.layerContainer())
我想你想要的是使用某种数据结构来存储创建的 Layer
对象,比如 list
或 dictionary
.
然后您可以稍后访问列表或字典(遍历它们)以获取图层对象。示例 -
layer_list = []
for rows in range(1, layerSheet.get_highest_row()+1):
layerObject = Layer(rows)
print(layerObject.layerContainer())
layer_list.append(layerObject)
然后访问你的图层对象-
for layerObject in layer_list:
print(layerObject)
#Do whatever you want with it.
此外,理想情况下,您不应使用与函数名称相同的变量名称,尤其是在 class 中,因为当您这样做时 -
def layerContainer(self):
self.layerContainer = dict(zip(self.keyFields, self.layerData))
return self.layerContainer
您正在使用字典覆盖 layerContainer
函数,因此在调用此函数后,您无法再将 layerContainer 作为函数访问。
我想使用迭代器生成 class 的多个实例,但我也希望能够为在此过程中创建的每个单独实例分配一个变量。有没有办法做到这一点?下面是我当前的代码,结果是我能够打印我希望访问的数据,但是每次迭代时创建的对象都会被覆盖。理想情况下,我想为从迭代器生成的每个字典分配单独的变量,以便我可以对它们应用其他函数。因此,如果电子表格包含 3 行中的数据,那么我将有 3 个不同的 layerObject,而不是最后只有一个 layerObject。如果不预先定义将要创建的对象的数量,我似乎无法弄清楚如何做到这一点,但是我希望它保持足够的灵活性,以便它可以生成(并保存)与行数一样多的对象数据。有办法吗?
import openpyxl
layerFile = openpyxl.load_workbook('\xxx/xxx/xxx.xlsx')
layerSheet = layerFile.get_sheet_by_name('Sheet1')
class Layer:
def __init__(self, layerNumber):
#initialize list to hold layer data
self.layerData = []
self.keyFields = []
#read layer attribute data from excel file
for columns in range(1, layerSheet.get_highest_column()+1):
cellData = layerSheet.cell(row = layerNumber + 1, column = columns).value
cellFields = layerSheet.cell(row = 1, column = columns).value
self.layerData.extend([cellData])
self.keyFields.extend([cellFields])
#creates dictionary that contains layer information
def layerContainer(self):
self.layerContainer = dict(zip(self.keyFields, self.layerData))
return self.layerContainer
#reads the file for all layers in the excel file and creates
for rows in range(1, layerSheet.get_highest_row()+1):
layerObject = Layer(rows)
print(layerObject.layerContainer())
我想你想要的是使用某种数据结构来存储创建的 Layer
对象,比如 list
或 dictionary
.
然后您可以稍后访问列表或字典(遍历它们)以获取图层对象。示例 -
layer_list = []
for rows in range(1, layerSheet.get_highest_row()+1):
layerObject = Layer(rows)
print(layerObject.layerContainer())
layer_list.append(layerObject)
然后访问你的图层对象-
for layerObject in layer_list:
print(layerObject)
#Do whatever you want with it.
此外,理想情况下,您不应使用与函数名称相同的变量名称,尤其是在 class 中,因为当您这样做时 -
def layerContainer(self):
self.layerContainer = dict(zip(self.keyFields, self.layerData))
return self.layerContainer
您正在使用字典覆盖 layerContainer
函数,因此在调用此函数后,您无法再将 layerContainer 作为函数访问。