TypeError: ‘module‘ object is not callable python报错解决及问题分析

代码片段

ExcelReader.py

import openpyxl


class ExcelReader:

    # constructor
    def __init__(self,
                 file_path=True,
                 sheet_name=True,
                 ):
        self.file_path = file_path
        self.sheet_name = sheet_name
        self.wb = self.load_excel(file_path)
        self.ws = self.wb[sheet_name]

    @staticmethod
    def load_excel(excel_url):
        return openpyxl.load_workbook(excel_url)

    def get_max_row_index(self):
        return self.ws.max_row

test.py

import ExcelReader

er = ExcelReader("/Users/scott/tmp/test.xlsx",'Sheet1')
print(er)

报错

使用python版本为3.7

/usr/local/bin/python3.7 /Users/scott/project/python_project/pythonSdk/excelSdk/test.py 
Traceback (most recent call last):
  File "/Users/scott/project/python_project/pythonSdk/excelSdk/test.py", line 3, in <module>
    er = ExcelReader("/Users/scott/tmp/test.xlsx",'Sheet1')
TypeError: 'module' object is not callable

原因分析

      调用代码很简单,就是通过ExcelReader构造函数生成对象并且打印。这里总不会调用错误,想到了import这块,是不是在引入的时候出了问题,毕竟咱python是半路出家,面相谷歌编程人员。import关键字是有不同得用法,于是我谷歌百度了一翻,发现还真是有些许区别。
      首先我们来了解一下什么是模块。

模块

      Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。
那么,模块到底指的是什么呢?模块,英文为 Modules,至于模块到底是什么,可以用一句话总结:模块就是 Python 程序。换句话说,任何 Python 程序都可以作为模块。

import使用方法

import使用方法有许多,我们今天只分析两种比较常用得方式。
      1.import 模块名1 [as 别名1], 模块名2 [as 别名2],…:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
      2.from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
这其中'as 别名'部分是可以省略的,我们看下代码示例直接。我们仅针对当前问题列举几种方式。

1.导入整个模块

# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])

2.导入整个模块并指定别名

# 导入sys整个模块,并指定别名为s
import sys as s
# 使用s模块别名作为前缀来访问模块中的成员
print(s.argv[0])

3.from…import 语法来导入指定成员

# 导入sys模块的argv成员
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])

4.from…import 语法来导入指定成员并指定别名

#导入sys模块的argv成员,并为其指定别名v
from sys import argv as v
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])

错误修正

看到这里,大家应该能发现问题所在了,和我最初猜测的一样是import出了问题,我们看看我们代码如何修正。

方式一

import ExcelReader
#需要使用ExcelReader模块名当做前缀来访问
er = ExcelReader.ExcelReader("/Users/scott/tmp/test.xlsx",'Sheet1')
print(er)

方式二

from ExcelReader import ExcelReader
#导入了指定得访问对象,可以直接访问
er = ExcelReader("/Users/scott/tmp/test.xlsx",'Sheet1')
print(er)
/usr/local/bin/python3.7 /Users/scott/project/python_project/pythonSdk/excelSdk/test.py 
<ExcelReader.ExcelReader object at 0x102942110>
Process finished with exit code 0

我们修正后正确打印出了结果。点赞收藏,富婆包养✋✋

猜你喜欢

转载自blog.csdn.net/u010786653/article/details/129056180