为什么访问"自我"。BASE_DIR'导致"AttributeError: 'str' object has no attribute 'BASE_DIR'"?



在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文档中的这篇:《首先看类》。

如何修复

基本上,你犯了两个错误:

  1. 直接在main类上调用check,而不是在main实例上调用
  2. 在没有正确参数的情况下定义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.stringself.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()

相关内容

  • 没有找到相关文章

最新更新