您的位置:首页 > 移动开发 > Objective-C

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

2016-12-08 11:23 1111 查看
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'这个字符
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python