TypeError: gettext() missing 1 required positional argument: 'self' - python
我对python还不熟悉,我正在努力为一个模块创建一个类,用于检查文本中的诅咒。有人能帮忙吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import urllib
class Checktext:
def __init__(self, text):
self.text = text
def gettext(self):
file = open(self.text,"r")
filetext = open.read()
for word in filetext.split():
openurl = urllib.request.urlopen("http://www.wdylike.appspot.com/?q=" + word)
output = openurl.read()
truer ="true" in str(output)
print(truer)
s = Checktext(r"C:\Users\Tzach\.atom\Test\Training
eadme.txt")
Checktext.gettext() |
- 你可能想要的是s.gettext(),而不是Checktext.gettext()。正如您所知道的:要包含一个代码块,请将其粘贴为文本,然后选择它并按{}按钮。这将使代码块缩进4个空格,这就是代码块的制作方式。>是引号块。
urllib是一个软件包。您必须导入包中的模块request:
open(filename)返回一个文件对象。您要调用该对象的方法:
正如G.Anderson所写,你想叫s.gettext(),而不是Checktext.gettext()。里面的self实际上等于外面的s。如果你想变得怪异,那么你也可以使用:
注意,作为缺少的参数传递的s。这里,python实际上揭示了面向对象的东西是如何在内部实现的。在大多数OO语言中,它是小心隐藏的,但是调用对象的方法在内部总是被翻译为传递一个指向类实例(即对象)的更特殊的参数。在定义一个python方法时,这个特殊的参数被显式命名为self(按照约定;您可以用不同的名称命名——您可以尝试作为讲座,但您应该始终保持这种约定)。
仔细考虑一下,您可以得到OO语言语法隐藏魔力的关键概念。类(对象)的实例实际上只是内存中存储数据部分的一部分,并传递给实现方法的函数。Checktext.gettext实际上是函数,s是对象。s.gettext()实际上只是表达完全相同的一种不同的方式。由于s是Checktext类的实例,因此事实存储在s中。因此,s.gettext()产生了一种假象,即rigth代码将被神奇地调用。如果认为s是一种有形的东西,那么它比功能方法更适合受过训练的大脑。
- 不同意你的第一部分回答。您可以使用from urllib import request作为request.urlopen()使用,也可以像op导入import urllib那样导入整个包,并将其称为urllib.request.urlopen()。如果要使用包中的多个模块,则最好使用第二个模块
- @安德森,这不是意见分歧。这只是导入名为request的模块的另一种形式。(然后您还必须更改代码。)另一方面,您不能只导入包。
- 我不确定我是否误解了你的意思。您可以导入整个urllib包,该包一次导入它包含的所有模块,而不是一次导入一个模块。这是我唯一不同意你的部分,你说你"必须"只导入模块。如果我叫import urllib,那就叫urllib.request.urlopen('http://www.google.com'),它工作得很好()。只导入计划使用的模块只会提高内存效率。
- @G.安德森,这对我不起作用。你能出示密码吗?你用什么Python?
- 我现在明白了。我可以在jupyter笔记本中运行我的代码,但是在命令行ipython或脚本文件中,只有当我从urllib导入请求时,它才起作用。很奇怪的行为!
- @G.Anderson有时候,也可能是您导入了EDOCX1(例如9)作为其他功能的一部分。然后,import urllib实际上什么也不做,但是已经导入了正确的模块。因此,由于导入命令不起作用,它似乎起作用。
- 我试过了,没有,即使是在一个全新的,新鲜的Jupyter会议和干净的笔记本上,import urllib自动拉入urllib.request。奇怪的。
您声明s为新的checktext对象,因此需要调用s.gettext()而不是未实例化的Checktext.gettext(),因为它没有self来引用