如何将参数传递给__init__函数

时间:2017-11-18 16:50:32

标签: python excel arguments

我开始在python中旅行。我想创建一个程序,将我的xlsx文件转换为sql文件,然后将数据加载到数据库中。

我想创建具有两个参数的类:

  • ex - 将打开xlsx工作簿
  • sh - 将从ex打开正确索引的工作表

这是初始版本(现在我只是打印行):

class XToSql():
    def __init__(self, ex = xlrd.open_workbook('ex1.xlsx'), sh = ex.sheet_by_index(0)):
        self.ex = ex
        self.sh = sh

    def modify(self):
        for i in str((self.sh.nrows-1)):
            a = 1
            print(self.sh.row_values(a))
            a += 1

a1 = XToSql()
a1.modify()

__init__函数中,此行标有红色:sh = ex.sheet_by_index(0) ->,运行后出现此错误: def __init__(self, ex = xlrd.open_workbook('ex1.xlsx'), sh = ex.sheet_by_index(0)):

NameError: name 'ex' is not defined

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:2)

__init__的参数列表中,ex尚未进行评估,因此sh = ex.sheet_by_index(0))会抛出NameError。这是在创建类对象时发生的。

你可以做几件事。编写一个类的一个原因是你可以重用它,所以也许类只应该把文件路径作为参数。

class XToSql():

    def __init__(self, ex_file):

        self.ex = xlrd.open_workbook(ex_file)
        self.sh = self.ex.sheet_by_index(0)

    def modify(self):
        for i in str(self.sh.nrows - 1):
            a = 1
            print(self.sh.row_values(a))
            a += 1

也许您应该能够指定要处理的工作表

class XToSql():

    def __init__(self, ex_file, sheet=0):

        self.ex = xlrd.open_workbook(ex_file)
        self.sh = self.ex.sheet_by_index(sheet))

    def modify(self):
        for i in str(self.sh.nrows - 1):
            a = 1
            print(self.sh.row_values(a))
            a += 1

并像这样使用

a = XToSql(ex_file='ex1.xlsx', sheet=0)

答案 1 :(得分:2)

ex方法的正文中,

__init__不可用。您无法在方法体外部访问方法的参数。

您需要执行以下操作:

class XToSql:
    def __init__(self, ex, sh=None):
        self.ex = ex
        if sh is None:
            sh = ex.sheet_by_index(0)
        self.sh = sh

然后像这样称呼它:

a1 = XToSql(xlrd.open_workbook('ex1.xlsx'))