这里有一位经验丰富的VBA程序员,正在开始深入研究Python OOP。我担心这很简单,我在找不到帮助的问题时遇到了问题。
我写了以下代码:
#Import packages
import openpyxl as xl
import os
class DataExtract:
#Initialize the class
def __init__(self,wb):
self.wb = wb
#Set class method to return sheet for named range
@classmethod
def rng_sht(cls,dest):
for title, coord in dest:
return(title)
#Set class method to return cell for named range
@classmethod
def rng_coord(cls,dest):
for title, coord in dest:
return(coord)
#Set class method to retun value of named range
@classmethod
def rng_val(cls,rng):
#Define destinations
dest = wb.get_named_range(rng).destinations
#Retrieve sheet
sht = DataExtract.rng_sht(dest)
coord = DataExtract.rng_coord(dest)
#Return value
return()
#Define workbook
wb = 'Test_WB'
#Initiate class
wb_cur = DataExtract(wb)
#Find temp for current sheet
Temp = wb_cur.rng_val('Temp')
我知道我的缩进是不正确的。
我遇到的问题是,当我调用rng_val类方法时,它只返回我调用的第一个方法的当前值(在本例中为“sht”)。当我取消激活“sht”行时,“coord”行正常工作。
我怀疑问题可能是由于我如何调用类方法或我如何构建类,但我不确定。
我已经根据你们所有人的反馈更新了代码,我的脚本如下。我仍然在退出rng_val类中的循环时出错,Max建议yield
解决。我试图修复无济于事。
#Import packages
import openpyxl as xl
import os
class DataExtract:
#Initialize the class
def __init__(self,wb):
self.wb = wb
#Set class method to return sheet for named range
@classmethod
def rng_sht(cls,dest):
for title, coord in dest:
return title
#Set class method to return cell for named range
@classmethod
def rng_coord(cls,dest):
for title, coord in dest:
return coord
#Set class method to retun value of named range
@classmethod
def rng_val(cls,wb,rng):
#Define destinations
dest = wb.get_named_range(rng).destinations
#Retrieve sheet
sht = cls.rng_sht(dest)
coord = cls.rng_coord(dest)
print(sht)
print(coord)
#Return value
return 1
path = 'C:\\Users\\User\\Desktop\\Python\\PracFiles\\'
#Loop through workbooks in a given folder
for i in os.listdir(path):
#Define workbook
wb = xl.load_workbook(path + i,data_only=True)
#Find temp for current sheet
Temp = DataExtract.rng_val(wb,'Temp')
答案 0 :(得分:0)
我可以看到有几个问题可能与您对Python OO缺乏经验有关。
return
语句不能后面加括号。这会导致函数返回空元组而不是空元素。return coord
。 return
本身就会退出该功能。任何类方法中的第一个参数都包含通过对象调用时该类的实例。您在构造函数中将其称为self
,在其他方法中将其称为cls
。他们是一样的东西。你没有在你的代码中使用它,它看起来应该是这样的。见下文:
sht = DataExtract.rng_sht(dest)
coord = DataExtract.rng_coord(dest)
这会将函数rng_sht
静态调用作为dest
的实例传递DataExtract
,而我似乎并不打算这样做。你应该做的是使用cls.rng_sht(dest)
来引用对象实例。此外,您无法通过自己引用类字段来访问类字段,例如wb.get_named_range(rng)
其中wb
是DataExtract
中的字段。而是通过cls
cls.wb.get_named_range(rng)
引用它