【问题标题】:TypeError: gettext() missing 1 required positional argument: 'self' - pythonTypeError:gettext()缺少1个必需的位置参数:'self'-python
【发布时间】:2018-12-20 16:20:55
【问题描述】:

我是 python 新手,我正在尝试为一个检查文本中的诅咒的模块创建一个类。 有人可以帮忙吗?

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\readme.txt") 
Checktext.gettext()

【问题讨论】:

  • 您可能想要s.gettext() 而不是Checktext.gettext()。请注意:要包含一段代码,请将其粘贴为文本,然后选择它并按下{} 按钮。这会将其缩进 4 个空格,这就是代码块的制作方式。 >quote 块。

标签: python python-3.x class self


【解决方案1】:

您将s 声明为一个新的Checktext 对象,因此您需要调用s.gettext() 而不是未实例化的Checktext.gettext(),因为它没有self 可以引用

【讨论】:

    【解决方案2】:

    urllib 是一个包。您必须导入位于包中的模块 request

    import urllib.request
    

    open(filename) 返回一个文件对象。你想调用那个对象的方法:

    filetext = file.read()
    

    正如 G. Anderson 所写,您想调用 s.gettext() 而不是 Checktext.gettext()。内部的self 实际上等于外部的s。如果你想变得怪异,那么你实际上也可以使用:

    Checktext.gettext(s)
    

    注意 s 作为您的 missing 参数传递。这里 Python 实际上揭示了面向对象的事物是如何在内部实现的。在大多数 OO 语言中,它被小心地隐藏了,但是调用对象的方法总是在内部被翻译为传递一个指向类的 instance 的特殊参数,即 对象。在定义 Python 方法时,该特殊参数显式命名为 self(按照约定;您可以将其命名为不同的名称——您可以尝试作为讲座,但您应该始终保持该约定)。

    仔细想一想,你就会明白 OO 语言语法的隐藏魔力的关键思想。类的实例(对象)实际上只是存储数据部分的内存的一部分,它被传递给实现方法的函数。 Checktext.gettext 实际上是函数,s 是对象。 s.gettext() 其实只是表达方式不同而已。 AS sChecktext 类的实例,事实存储在s 中。因此,s.gettext() 会产生一种错觉,即正确的代码将被神奇地调用。如果s 被认为是有形的东西,那么它比函数方法更适合受过训练的大脑。

    【讨论】:

    • 不同意您答案的第一部分。您可以from urllib import request 并将其用作request.urlopen(),或者您可以像OP 所做的import urllib 那样导入整个包并将其称为urllib.request.urlopen()。如果您想使用包中的多个模块,则第二种更可取
    • @G.安德森 这不是分歧。这只是导入名为request模块 的另一种形式。 (然后您还必须更改代码。)另一方面,您不能只导入 一个包
    • 我不确定我是否误解了你的意思。您可以导入整个urllib 包,它一次导入它包含的所有模块,而不是一次导入一个。这是我不同意你的唯一部分,你说你“必须”只导入模块。如果我import urllib 然后调用urllib.request.urlopen('http://www.google.com') 它工作得很好(<http.client.HTTPResponse at 0x19e898fa668>)。仅导入您计划使用的模块会更节省内存。
    • @G.Anderson 它对我不起作用。你能显示代码吗?你用什么 Python?
    • 我现在看到了混乱。我可以在 jupyter notebook 中运行我的代码,但是在命令行 ipython 或脚本文件中,它只有在我从 urllib 导入请求时才有效。非常奇怪的行为!
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 2021-12-15
    • 2023-02-06
    • 2021-09-15
    • 2013-07-06
    • 2022-01-05
    • 2017-03-28
    相关资源
    最近更新 更多