我最近接手维护一个用Python编写并使用web.py的网站。我创建了一个我想要导入的类,但是我得到了“TypeError:'module'对象不可调用”错误。所有.py模块都存储在目录调用“lib”中。在lib目录中有以下模块 - noun.py,verb.py,context.py,word.py,base.py。在lib目录中是--init--.py文件。我正在尝试将noun.py模块导入上下文模块。下面是context.py模块中用于导入其他模块的代码。
from lib import verb, word, base
这似乎适用于导入动词,单词和基本模块。但是,当我在该语句的末尾添加名词以使其成为...
from lib import, verb, word, base, noun
我得到“TypeError:'module'对象不可调用”错误。我也试过......
import noun #Also produces the same error
所以我尝试了以下......
from noun import *
当我以这种方式导入模块时,错误被消除,但是当我引用名词模块的属性时,我得到错误“AttributeError:名词实例没有属性'get_stem_used'”。以下是名词模块的代码......
from base import base
class noun:
wordBase = None
stemBase = None
def __init__(self, pId):
b = base()
wrdBase = b.get_word_base(pId)
self.wordBase = wrdBase['base']
stmBase = b.get_stemBase(pId)
self.stemBase = stmBase['stem']
#Code to make sure the module is instantiated correctly and the data is validated
def get_output(self):
return self.wordBase
def get_stem_used(self):
return self.stemBase
verb.py模块与noun.py模块的代码基本相同。在context.py模块中,我有以下代码......
n = noun(id)
base = n.get_output()
#I print out base to make sure everything is good and it is
v = verb(id)
verb = v.get_output()
然后将“n”和“v”传递给word.py模块。在word.py模块中有以下代码。
if v.get_stem_used == "Some Value":
#do whatever
elif n.get_stem_used == "Another value": #This line produces the "attribute error"
#do something
当我尝试访问n.get_stem_used时,我得到“AttributeError:名词实例没有属性'get_stem_used'”错误。我做了一些研究,我遇到了这个网址http://effbot.org/zone/import-confusion.htm这让我相信我没有正确导入名词模块,因为我没有使用以下代码导入名词模块...不允许我使用点符号来引用带有名词类的元素。
from lib import, verb, word, noun
我很奇怪,在上面的语句末尾添加“noun”是行不通的,但它似乎正确地导入了所有其他模块。我已经看到混合选项卡和空格可能会导致此错误,但我已经使用我的编辑器检查它是否已正确选项卡。我已经在这方面工作了一段时间,所以任何帮助都非常感谢。感谢。
以下是--init - .py
中的内容#!/usr/local/bin/python2.5
# -*- coding: utf-8 -*-
答案 0 :(得分:3)
似乎课程和模块之间存在混淆。你说你正在做from lib import noun
,然后是n = noun(id)
。这是您的错误的来源:noun
这里是指名词模块,而不是该模块中的名词类。 Java不是Python:类是可以从模块中单独导入的名称,它们不必与它们所在的模块具有相同的名称,并且模块中可以有多个类。
所以,你要么做:
from lib import noun
n = noun.noun(id)
或
from lib.noun import noun
n = noun(id)
(顺便说一句,如果您使用符合PEP8的名称,这很明显:您导入noun
但是实例化Noun
。)
其他“非Java”要点:不需要get_output
和get_stem_used
方法,只需直接引用wordBase
和stemBase
。但是,如果你做有这些方法,你需要在你的比较中实际调用它们:if n.get_stem_used() == "Another value"
等等。 (虽然Java也是如此,当然 - 你可能使用过Ruby或Scala吗?)