0
class Parser():
        html_escape_table = {
            "&": "&",
            '"': """,
            "'": "'",
            ">": ">",
            "<": "&lt;",
            }
        def html_escape(text):
            return "".join(html_escape_table.get(c,c) for c in text)
        def query():
            database = [x, y, z, etc, etc2]
            for x in database:
                html_escape(x)
                print x #for testing purposes
                return
test = Parser()

test.query()

我这样做正确吗?我不断收到错误消息:

TypeError: query() takes no arguments (1 given)

我没有看到将参数传递给查询甚至解析器的任何地方。

有人可以解释我在这里做错了什么吗?

我尝试只调用 Parser.query() 并收到此错误(这是在将 self 参数添加到我的所有函数和 object 参数到我的 Parser 类之后)

    Parser.query()
TypeError: unbound method query() must be called with Parser instance as first argument (got nothing instead)
4

5 回答 5

7

类中的方法需要参数self,这与将实例解析为python如何执行实例方法的方法有关。

例如

class Test(object):
    def say_hello(self):
        print "Hi there"

如果您想将参数解析为您仍然需要的实例方法,只需对此进行扩展self

class Test(object):
    def say_hello(self, name):
        print "Hi %s" % name

编辑:

好吧,进一步解释它你必须知道python如何处理实例,python以非常详细和清晰的方式处理实例,self总是用来引用它自己或这个当前实例,就像this在Java中一样。因此,当 python 调用my_instance.method()它的实际调用时TheObject.method(my_instance),为什么 self 指的my_instance是方法内部。这允许您在方法内部使用实例,而实例本身在参数内部传递。

编辑2:

即使您将 self 作为方法的参数,您也需要从这样的实例中调用它

my_parser = Parser()
my_parser.method()

编辑3:

这不是Java,您不必将函数作为类中的方法绑定在一起,只需将它们作为自由漫游函数保留在 parser.py 文件中即可

import parser
parser.do_this()
于 2012-07-05T00:26:05.130 回答
4

在 Python 中,类方法的第一个参数必须是self

class Parser(): # Creates a class that contain all of the functions that parse the mood based on tweets
    html_escape_table = {
            "&": "&amp;",
            '"': "&quot;",
            "'": "&apos;",
            ">": "&gt;",
            "<": "&lt;",
    }
    def html_escape(self, text):
        return "".join(html_escape_table.get(c,c) for c in text)
    def query(self):
        database = [x, y, z, etc, etc2]
        for x in database:
            html_escape(x)
            print x #for testing purposes
            return

test = Parser()

test.query()
于 2012-07-05T00:26:41.133 回答
2

一件小事:如果你开始在 Python 中使用类(至少在 Python 2.x 中,Python 3 不同),你可能想要使用新的样式类,它继承自object.

Python 2.x 类,新风格:

class MyClass(object):
    def __init__(self, args):
        # some code here

    # more methods here

object在 Python 2 的当前版本中不应再使用旧样式类(不带)。

如果您使用的是 Python 3,情况就不同了。类是在 Python 3 中进行清理的概念之一,因此不再需要继承object。因此,如果您正在学习在 Python 中使用类,请确保您获得的说明适用于正确的版本(主要是 2 vs 3)。

于 2012-07-05T00:30:10.017 回答
2

在任何面向对象的语言中,方法都必须能够访问调用它们的对象。在某些语言中,这是隐式完成的。在 Python 中,必须使用显式的第一个self参数声明方法。

在这里,我已将您的代码修复为具有self参数。

class Parser():
    """A class that contain all of the functions that parse the mood based on tweets."""
    html_escape_table = {
        "&": "&amp;",
        '"': "&quot;",
        "'": "&apos;",
        ">": "&gt;",
        "<": "&lt;",
        }
    def html_escape(self, text):
        return "".join(self.html_escape_table.get(c,c) for c in text)

    def query(self):
        database = [x, y, z, etc, etc2]
        for x in database:
            self.html_escape(x)
            print x #for testing purposes
            return

test = Parser()    
test.query()

当您调用类似test.query()query方法时,会调用该方法,并作为参数test传入。self此外,在您的方法中,当您想要引用对象时,您必须使用self参数显式访问属性。

最后一点:在您的query()方法中,您在 for 循环中返回,因此您只会执行循环的一次迭代,而不是遍历所有database.

于 2012-07-05T00:53:48.533 回答
1

啊!

您正在调用类型query为 的对象(称为testParser。在引擎盖下,python 正在做的是调用Parser.query(test).

这就是为什么在类中编写方法时,应始终将self其作为第一个参数包含在内。

正如其他人所提到的,将您的函数签名更改为def query(self)可以解决此问题

希望有帮助

于 2012-07-05T00:28:20.697 回答