【问题标题】:Python Class Method Line Not RunningPython 类方法行未运行
【发布时间】:2018-07-28 16:49:02
【问题描述】:

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

【问题讨论】:

  • 如果您知道 - 为什么不修复它?
  • 复制时出现缩进问题。鉴于代码的简单性,我不怀疑任何人会遇到任何问题。
  • 但是如果我们试图重现您的问题,那么我们必须纠正缩进,因为您不会被打扰。
  • 好吧,下一个 python 新手发现这个问题与你的问题似乎也是他的问题 - 也许重新访问 how to askmvce,Python 需要缩进并且没有它会引入更多错误在我们必须修复的代码中。
  • rng_val 中,您在循环中有一个return,这会导致循环在第一次迭代期间退出。您可能想看看yield 关键字。

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


【解决方案1】:

我发现有几个问题可能与您对 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)

【讨论】:

  • return(1) 不返回元组 - 它返回一个 int。 return 1, 返回一个元组,return(1,)
  • return()return(1,) 都返回元组。
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
相关资源
最近更新 更多