python-3.x - 如何在 Python 的 __init__ 中声明一个设置为方法的全局变量?
问题描述
我是面向对象编程的新手,在声明设置为类中方法的全局变量时遇到了一些麻烦。我在方法中声明了它们__init__
(我希望它们在类内,而不是在类外)self.censored_transcript = self.apply_filter()
,并且在这个文件中,一切正常。但是当我在不同的 .py 文件中导入类并实例化 Profanity 类时,会出现以下错误: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)
解决方案
您可以self.censored_transcript
在类内的所有地方使用 -self
指类的当前对象。您的类的每个创建的对象都将存储自己self
的可用变量集。
censored_transcript
不self
被视为常规局部变量,它将为每次方法调用新创建。
错误原因:
当def apply_filter(self)
从外部 .py 文件调用方法时,检查将为 false,并且不会在该方法内部创建if __name__ == "__main__"
局部变量。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)
推荐阅读
- javascript - 如何通过两个刻度隐藏标签?图表
- ansible - 具有多个主机的 Ansible“任务逻辑”?
- javascript - 仅在登录后才能访问页面 - React
- nginx - 如何将 WWW url 重定向到 nginx 中的非 www url?
- sql - 将日期字段与oracle中的特定日期时间进行比较
- for-loop - How to remove all cloned gui in roblox
- python - 从 SQL 和 python 中的列表中选择
- c# - .Net Core 3.1 MVC - 授权 - 如何记录成功或失败的登录?
- ruby - 如何在 Sinatra 中维护使用 Pony gem 发送的电子邮件状态日志
- python - 自动更新请求授权承载