Python:制作一个类实例会产生AttributeError

时间:2018-09-05 07:16:31

标签: python class instance

我有问题。当我尝试创建类实例时,出现错误。 这是一些代码:

import parser

def main():
    tokens = [["TYPE_ONE", "value one"], ["TYPE_TWO", "value two"]]
    parse = parser.Parser(tokens)
    parse.parse()

main()

还有parser.py:

class Parser(object):
    def __init__(self, tokens):
        self.tokens = tokens
        self.token_index = 0

    def parse(self):
        while self.token_index < len(self.tokens):
        token_type = self.tokens[self.token_index][0]
        token_value = self.tokens[self.token_index][1]
        print(token_type, token_value)
        self.token_index += 1

但是脚本给出了以下错误:

Traceback (most recent call last):
  File "C:/Users/edyal/OneDrive/Desktop/Paigoa/src/main.py", line 8, in <module>
    main()
  File "C:/Users/edyal/OneDrive/Desktop/Paigoa/src/main.py", line 5, in main
    parse = parser.Parser(tokens)
AttributeError: module 'parser' has no attribute 'Parser'

2 个答案:

答案 0 :(得分:1)

这是python中的经典陷阱:如果您为模块命名的名称已经存在,那么您就不会得到想要的模块。通常这是相反的情况。例如,您调用csv解析器csv.py,然后在内部尝试导入csv。您导入的不是标准的python csv模块。

在这种情况下,必须采取另一种方法:您要导入解析器模块,而获得标准解析器模块。如果导入解析器,我会得到:

>>> import parser
>>> dir(parser)
['ParserError', 'STType', '__copyright__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_pickler', 'compilest', 'expr', 'isex
pr', 'issuite', 'sequence2st', 'st2list', 'st2tuple', 'suite', 'tuple2st']

首先,我建议将您的parser.py重命名为更具体的名称,例如paigoa_token_parser.py 现在更改您的导入:

import paigoa_token_parser

现在您可能会遇到导入错误,此时您应该检查路径。解析器是否与main.py位于同一文件夹中?如果没有,那么您可能想要将其添加到python路径

答案 1 :(得分:0)

来自modules documentation

  

导入名为垃圾邮件的模块时,解释器首先搜索具有该名称的内置模块。如果找不到,它将在变量sys.path给出的目录列表中搜索名为spam.py的文件。

内置模块的列表取决于安装,通常是标准库的一小部分,parser模块在​​您的安装中是内置模块的可能性很小(您可以通过执行以下命令来检查它) 'parser' in sys.builtin_module_names行)。

问题很可能出在您的目录结构中。例如,如果您的目录结构如下:

.
main.py
└── parser
    ├── __init__.py
    └── parser.py

并且__init__.py不会导入parser.py,要导入parser/parser.py,您必须执行以下代码:from parser import parser