在python类中,with open
行得到:
Traceback (most recent call last):
File "c:UsersanonymousDesktopchecker.py", line 54, in <module>
print(main.check("fubk"))
File "c:UsersanonymousDesktopchecker.py", line 13, in check
with open(f"{self.BASE_DIR}\wordlist.txt", "r") as words:
AttributeError: 'str' object has no attribute 'BASE_DIR'
class main:
BASE_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
def __init__(self, string, similarity: float = 0.76, BASE_DIR = BASE_DIR):
self.string = string
self.similarity = similarity
self.BASE_DIR = BASE_DIR
print(self.DATADIR)
def check(self):
with open(f"{self.BASE_DIR}\wordlist.txt", "r") as words:
badwords = words.read().splitlines()
您错误地使用了类。我建议你复习一下关于类的教程(同样,即使你已经有了),比如Python文档中的这篇:《首先看类》。
如何修复
基本上,你犯了两个错误:
- 直接在
main
类上调用check
,而不是在main
的实例上调用 - 在没有正确参数的情况下定义
check
,但在调用它时仍传递"fubk"
首先,将check
更改为适当的实例方法:
def check(self, word):
print(word)
with open(f"{self.BASE_DIR}\wordlist.txt", "r") as words:
badwords = words.read().splitlines()
if word in badwords:
...
实例方法的第一个参数应该是实例对象本身(self
)。因此,如果您想向函数传递一些参数,则需要将其添加到函数定义中(例如word
)。
第二,您需要实例化main
的对象。然后在上面调用check
。
main_obj = main("string", similarity=0.5)
main_obj.check("fubk")
这里,check
方法将接收实例对象作为self
(因此它可以访问所有self.string
、self.BASE_DIR
等实例属性),并接收输入"fubk"
作为word
。(我不知道string
参数是用来做什么的)。
原始错误是什么意思
您的原始错误:
print(main.check("fubk"))
File "c:UsersanonymousDesktopchecker.py", line 13, in check
with open(f"{self.BASE_DIR}\wordlist.txt", "r") as words:
AttributeError: 'str' object has no attribute 'BASE_DIR'
因为CCD_ 19在被调用时接收到CCD_ 20作为CCD_。如果打印出self
,您可以看到它。
def check(self):
print(self)
...
main.check("fubk")
其将打印出CCD_ 23。你的原始代码试图做到:
# {self.BASE_DIR}
"fubk".BASE_DIR
这导致CCD_ 24。
同样,如果您实例化对象并正确定义实例方法,那么这个错误是可以避免的。在Python中,self
有一个";特别的";意思:参见"自我"这个词的目的是什么?。
此外,为了避免混淆,不要给类变量和实例的变量起相同的名称。这可能会导致一些令人困惑的行为,您以后必须进行调试(例如:python类实例变量和类变量)。
class main:
# class variable
DEFAULT_BASE_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
# rename BASE_DIR function parameter
def __init__(self, string, similarity: float = 0.76, custom_base_dir = None):
...
# use parameter if provided or class default
self.BASE_DIR = custom_base_dir or DEFAULT_BASE_DIR
def check(self):
with open(f"{self.BASE_DIR}\wordlist.txt", "r") as words:
badwords = words.read().splitlines()