Python: 创建一个 class 实例给出 AttributeError
Python: Making a class instance gives AttributeError
我有问题。当我尝试制作 class 实例时,出现错误。
这是一些代码:
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'
这是 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 路径
When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path
内置模块列表依赖于安装,通常是标准库的一小部分,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
我有问题。当我尝试制作 class 实例时,出现错误。 这是一些代码:
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'
这是 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 路径
When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path
内置模块列表依赖于安装,通常是标准库的一小部分,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