Python类方法行未运行

2024-09-29 23:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是一位经验丰富的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\u val类方法时,它只返回我在其中调用的第一个方法的当前值(在本例中为“sht”)。当我停用“sht”行时,“coord”行正常工作。你知道吗

我怀疑这个问题可能是由于我是如何调用类方法或者我是如何构造类的,但是我不确定。你知道吗

更新

我已经用你们所有人的反馈更新了代码,下面是我的脚本。我在退出rng\u 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')

Tags: forreturndefrangemethodclassnameddest
1条回答
网友
1楼 · 发布于 2024-09-29 23:29:02

我可以看出,有几个问题可能与您对Python-OO缺乏经验有关。你知道吗

  1. 空的return语句后面不能有括号。这将导致函数返回一个空元组而不是空元组。你知道吗
  2. 如果您计划让函数返回一个值,请将该值(或变量)直接放在return语句后面,如下:return coordreturn本身将退出函数。你知道吗
  3. 任何类方法中的第一个参数都包含通过对象调用时该类的实例。在构造函数中调用它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),其中wbDataExtract中的字段。而是通过cls引用它,比如cls.wb.get_named_range(rng)

相关问题 更多 >

    热门问题