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

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
    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'这个字符

你可能感兴趣的:(Python,python)