【问题标题】:TypeError: 'module' object is not callable - Call to constructorTypeError:“模块”对象不可调用 - 调用构造函数
【发布时间】:2021-03-13 16:21:31
【问题描述】:

我刚刚开始学习 python 并尝试实现一个非常基本的程序。这是代码

from com.gs.entities import Employee
from _datetime import datetime, timedelta


class Branch:

    def __init__(self, branchName):
        self.branchName = branchName
        self.startTime = datetime.now()
        self.endTime = datetime.now() + timedelta(hours = 9)
        self.employees = []
        for i in range(0, 10):
            if(i < 6):
                self.employees.append(Employee(i, str(i), "Cashier"))
            elif(i < 8):
                self.employees.append(Employee(i, str(i), "Loan Officers"))
            elif(i == 8):
                self.employees.append(Employee(i, str(i), "Deputy Manager"))
            elif(i == 9):
                self.employees.append(Employee(i, str(i), "Manager"))
        
    def startOperation(self):
        print("Starting operation at " + self.startTime)

    def endOperation(self):
        print("Starting operation at " + self.endTime)


b = Branch("CP")
print(b.employees)

这是Employee类的代码

class Employee:

    def __init__(self, employeeId, employeeName, employeeRole):
        self.employeeId = employeeId
        self.employeeName = employeeName
        self.employeeRole = employeeRole

现在当我运行 Branch 类时,它会抛出以下错误

self.employees.append(Employee(i, str(i), "Cashier"))

TypeError: 'module' 对象不可调用

如果我将行更改为 self.employees.append(i),错误就会消失。我想做的是创建该分支机构的员工列表。

【问题讨论】:

  • Employee 是否恰好位于名为 Employee.py 的文件中?你可能需要from com.gs.entities.Employee import Employee
  • 是的 Employee 类在 Employee.py 中,典型的基于 java 的方法。你的建议,我会检查并回复。
  • @TimRoberts - 你的建议奏效了,这背后的理由是什么?
  • com.gs.entities.Employee 是模块的名称。因此,当您执行from com.gs.entities import Employee 时,将导入名为“Employee”的模块 在该模块中,有一个名为Employee 的类。所以,你可以说Employee.Employee(i, str(i), "Cashier")。这与标准的array 模块相同。你可以说import arrayx = array.array('h'),也可以说from array import array(从模块数组,导入类数组)和x = array('h')

标签: python python-3.x


【解决方案1】:

我将所有内容都放在同一个文件中,这对我来说效果很好。输出有点奇怪,因为您还没有为您的对象实现 toString() 方法,但是您的员工列表会很好地附加:

from _datetime import datetime, timedelta

class Employee:

    def __init__(self, employeeId, employeeName, employeeRole):
        self.employeeId = employeeId
        self.employeeName = employeeName
        self.employeeRole = employeeRole
    def toString(self):
        return......      
        
        
class Branch:

    def __init__(self, branchName):
        self.branchName = branchName
        self.startTime = datetime.now()
        self.endTime = datetime.now() + timedelta(hours = 9)
        self.employees = []
        for i in range(0, 10):
            if(i < 6):
                self.employees.append(Employee(i, str(i), "Cashier"))
            elif(i < 8):
                self.employees.append(Employee(i, str(i), "Loan Officers"))
            elif(i == 8):
                self.employees.append(Employee(i, str(i), "Deputy Manager"))
            elif(i == 9):
                self.employees.append(Employee(i, str(i), "Manager"))
        
    def startOperation(self):
        print("Starting operation at " + self.startTime)

    def endOperation(self):
        print("Starting operation at " + self.endTime)


b = Branch("CP")

[print(i) for i in b.employees] 

输出:

<__main__.Employee object at 0x7ffa98a62a58>
<__main__.Employee object at 0x7ffa98a62a90>
<__main__.Employee object at 0x7ffa98a62b70>
<__main__.Employee object at 0x7ffa98a62be0>
<__main__.Employee object at 0x7ffa98a62c50>
<__main__.Employee object at 0x7ffa98a62cc0>
<__main__.Employee object at 0x7ffa98a62d30>
<__main__.Employee object at 0x7ffa98a62da0>
<__main__.Employee object at 0x7ffa98a62e48>
<__main__.Employee object at 0x7ffa98a62eb8>

【讨论】:

  • 我使用的是基于 java 的方法。 Employee.py 中的员工类。
  • 这没有错。您只需要记住模块 Employee 包含一个类 Employee,这是两个不同的东西。
  • toString 是 Java;你想在 Python 中使用__str__
【解决方案2】:

正如@Tim Roberts 评论的那样,模块Employee.py 和其中的一个类Employee 是不同的,您必须引用该类本身。

这种命名方式在 Python 库中相当常见 - time.time()datetime.datetimePIL.Image.Image 等是我能立即回忆起来的一些示例。

一般来说,如果你想快速检查你正在导入的东西是否是包、模块、类、函数等......;您可以打开 python shell 并检查这些标识符指的是什么:

>>> from com.gs.entities import Employee
>>> Employee
<module 'com.gs.entities.Employee' from '/full/path/to/com.gs/entities/Employee.py'>
>>> Employee.Employee
<class 'com.gs.entities.Employee.Employee'>
>>> from com.gs.entities.Employee import Employee as Emp
>>> Emp
<class 'com.gs.entities.Employee.Employee'>

或一些类似的输出

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 2014-09-21
    • 2011-05-30
    • 2021-11-22
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多