python - Python:制作类实例会产生 AttributeError
问题描述
我有个问题。当我尝试创建一个类实例时,我得到一个错误。这是一些代码:
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 路径
推荐阅读
- xcode - XCode 13 警告:不推荐以手动顺序构建目标 - 检查“为命令行构建并行构建”但不存在这样的 UI 选项?
- azure - 使用 google 工作区验证 Azure SAML 的域
- css - Bootsrap 3 不等边框加粗
- python-sphinx - Doxygen 调用图:命名约定,与 Sphinx (Breathe) 一起使用
- terraform - Terraform 添加 lambda 层
- wordpress - Timber/Twig 显示:“致命错误:未捕获的 TypeError:参数 1 已传递给 Twig\CacheExtension\CacheStrategy..”
- react-native - 即使在使用 useCallback 之后,FlatList 也会在每次视图加载时呈现
- mocking - 测试信用卡号码如何标准化?
- javascript - 菜单打开时禁用单击并使背景变暗(div)
- firebase - 如何获取当前 LoggedIn 用户的 uid 以使用相应用户的数据(Flutter)