Python类方法行未运行

时间:2018-02-18 07:32:21

标签: python python-3.x class oop methods

这里有一位经验丰富的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')

1 个答案:

答案 0 :(得分:0)

我可以看到有几个问题可能与您对Python OO缺乏经验有关。

  1. return语句不能后面加括号。这会导致函数返回空元组而不是空元素。
  2. 如果您计划让函数返回一个值,请将值(或变量)放在return语句之后,如下所示:return coordreturn本身就会退出该功能。
  3. 任何类方法中的第一个参数都包含通过对象调用时该类的实例。您在构造函数中将其称为self,在其他方法中将其称为cls。他们是一样的东西。你没有在你的代码中使用它,它看起来应该是这样的。见下文:

    sht = DataExtract.rng_sht(dest)
    coord  = DataExtract.rng_coord(dest)
    
  4. 这会将函数rng_sht 静态调用作为dest的实例传递DataExtract,而我似乎并不打算这样做。你应该做的是使用cls.rng_sht(dest)来引用对象实例。此外,您无法通过自己引用类字段来访问类字段,例如wb.get_named_range(rng)其中wbDataExtract中的字段。而是通过cls

    cls.wb.get_named_range(rng)引用它