我是面向对象编程的新手,在声明设置为类中的方法的全局变量时遇到了一些困难。我在__init__方法中声明了它们(我希望它们在类中,而不是在外部),在这个文件中,一切都很好。但是,当我在不同的.py文件中导入类并实例化亵渎类时,会发生以下错误:UnboundLocalError: local variable 'censored_transcript' referenced before assignment。我在这个问题上做了不少研究,但找不到符合我情况的东西。global语句不起作用。有人能告诉我我怎么解决这个问题吗?非常感谢您提前!
文件1(要导入的文件),称为profanity_filter.py
from better_profanity import profanity
class Profanity(object):
def __init__(self, transcript_filename, wordlist_filename):
self.__transcript_filename = transcript_filename
self.__wordlist_filename = wordlist_filename
self.__transcript = self.__load_transcript()
self.censored_transcript = self.apply_filter()
def __load_transcript(self):
f = open(self.__transcript_filename, "r")
file = f.read()
f.close()
return file
def apply_filter(self):
if __name__ == "__main__":
profanity.load_censor_words_from_file(self.__wordlist_filename)
censored_transcript = profanity.censor(self.__transcript)
return censored_transcript文件2(测试文件):
from profanity_filter import Profanity
# Instantiate the Profanity class:
p = Profanity("sample_transcript.txt", "profanity_wordlist.txt")
# Apply the profanity filter.
censored_transcript = p.apply_filter()
print(censored_transcript)发布于 2020-10-21 12:47:42
您可以在类内的所有位置使用self.censored_transcript -- self引用类的当前对象。类中创建的每个对象都将存储可用的自self变量集。
不带censored_transcript的self作为正则局部变量处理,将为每次方法调用创建新的局部变量。
错误原因:当方法def apply_filter(self)从外部.py文件调用时,if __name__ == "__main__"检查将为false,并且局部变量censored_transcript不会在该方法中创建。因此,return censored_transcript尝试返回带有未赋值值的局部变量,但失败。
解决方案1:在apply_filter(self)中可以使用对象的censored_transcript (而不是本地的)来保存结果。只需在它之前附加self.。并且您不需要从此方法返回某些内容:
from better_profanity import profanity
class Profanity(object):
def __init__(self, transcript_filename, wordlist_filename):
self.__transcript_filename = transcript_filename
self.__wordlist_filename = wordlist_filename
self.__transcript = self.__load_transcript()
self.apply_filter() # changed
def __load_transcript(self):
f = open(self.__transcript_filename, "r")
file = f.read()
f.close()
return file
# changed
def apply_filter(self):
profanity.load_censor_words_from_file(self.__wordlist_filename)
self.censored_transcript = profanity.censor(self.__transcript)解决方案2:使用局部变量,但不使用if为其赋值。甚至忽略这个局部变量:
from better_profanity import profanity
class Profanity(object):
def __init__(self, transcript_filename, wordlist_filename):
self.__transcript_filename = transcript_filename
self.__wordlist_filename = wordlist_filename
self.__transcript = self.__load_transcript()
self.censored_transcript = self.apply_filter()
def __load_transcript(self):
f = open(self.__transcript_filename, "r")
file = f.read()
f.close()
return file
# changed
def apply_filter(self):
profanity.load_censor_words_from_file(self.__wordlist_filename)
return profanity.censor(self.__transcript)https://stackoverflow.com/questions/64463210
复制相似问题