python错误:TypeError: 'module' object is not callable

本文探讨了Python中从一个文件调用另一个文件中的类的两种方法,并解释了常见错误及其解决办法。同时,文章提到了文件名包含'Test'时触发单元测试的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TrainCorpusStructure.py 文件中的代码如下:

class TrainCorpusStructure:
    inputs = []

Demo.py中的代码如下:

from corpusProcess import TrainCorpusStructure

class Demo:
    def test(self):
        tcs = TrainCorpusStructure()
        tcs.inputs.append('fa')
        tcs.inputs.append('su')
        print(tcs.inputs)

        # TrainCorpusStructure.inputs.append('haohao')
        # TrainCorpusStructure.inputs.append('tttttttt')
        # print(TrainCorpusStructure.inputs)

if __name__ == '__main__':
    demo = Demo()
    demo.test()

其实想实现一个非常简单的功能,在TestFang.py文件中操作TrainCorpusStructure.py中的列表 inputs

但是遗憾的是提示有错误:

Traceback (most recent call last):
  File "/home/ubuntu/workspace/BioEvent/corpusProcess/TestFang.py", line 16, in <module>
    tf.test()
  File "/home/ubuntu/workspace/BioEvent/corpusProcess/TestFang.py", line 5, in test
    tcs = TrainCorpusStructure()
TypeError: 'module' object is not callable

于是在网上查询错误原因: 跟import导入机制有关

正确的写法有两种:

写法1:

from corpusProcess import TrainCorpusStructure

class Demo:
    def test(self):
        tcs = TrainCorpusStructure.TrainCorpusStructure()
        tcs.inputs.append('fang')
        tcs.inputs.append('su')
        print(tcs.inputs)

        # TrainCorpusStructure.inputs.append('haohao')
        # TrainCorpusStructure.inputs.append('tttttttt')
        # print(TrainCorpusStructure.inputs)

if __name__ == '__main__':
    demo = Demo()
    demo.test()

写法2:

import corpusProcess.TrainCorpusStructure as tc

class Demo:
    def test(self):
        tcs = tc.TrainCorpusStructure()
        tcs.inputs.append('fang')
        tcs.inputs.append('su')
        print(tcs.inputs)

        # TrainCorpusStructure.inputs.append('haohao')
        # TrainCorpusStructure.inputs.append('tttttttt')
        # print(TrainCorpusStructure.inputs)

if __name__ == '__main__':
    demo = Demo()
    demo.test()

仔细观察import导入的方式:明确一点的是,TrainCorpusStructure.py文件和TestDemo.py文件在同一个包里(即一个文件夹下)

写法1和写法2的区别有两点:

1,导入方式,写法1是:from Corpus import TrainCorpusStructure, 

                          写法2是:import corpusProcess.TrainCorpusStructure as tc

2, 调用方式不同,

写法1是: tcs = TrainCorpusStructure.TrainCorpusStructure(),

写法2是 tcs = tc.TrainCorpusStructure()

补充理解:其实明白了调用的规则非常容易理解,A.py 文件调用B.py文件的方法(注意不是函数)

规则:1,如果调用的是B.py文件中的方法,即B.py 中有Class B: 调用的原则是:模块名—类名—方法名

           2, 如果调用的是B.py文件中的函数:模块名—函数名

为了进一步测试:又写了一个类Wu.py

import corpusProcess.Demo as tfl
class Wu:
    def hehe(self):
        testF = tfl.Demo()
        testF.test()
        print('测试结果怎么样')
if __name__ == '__main__':
    ts = Wu()
    ts.hehe()

不明白的地方:如果我把Wu.py 命名为TestWu.py 或则 WuTest.py 的话, 运行Wu.py的时候就会进行单元测试而不会输出任何结果,我不明白为什么?待明确后补上

模块名如果有test或TEST等几个字符会进行单元测试,如果不是进行单元测试,不要使用'Test'这个字符

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值