第一次使用类 - 我做错了什么?

时间:2012-07-05 00:21:34

标签: python class methods

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。

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

我尝试调用Parser.query()并得到此错误(这是在我的所有函数和对象参数中添加self参数到我的Parser类之后)

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

5 个答案:

答案 0 :(得分:7)

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

e.g。

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总是用于引用自身或当前实例,就像{{1在Java中。所以当python调用this实际调用my_instance.method()时,为什么self指的是方法内的TheObject.method(my_instance)。这允许您在方法内使用实例,实例本身在arugments中传递。

编辑2:

即使你有自己作为方法的参数,你需要从像这样的实例中调用它

my_instance

编辑3:

这不是Java,你不必将你的函数作为类中的方法绑定在一起,只需将它们作为自由漫游函数放在parser.py文件中,然后就可以了

my_parser = Parser()
my_parser.method()

答案 1 :(得分: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()

答案 2 :(得分:2)

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

Python 2.x类,新风格:

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

    # more methods here

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

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

答案 3 :(得分: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

答案 4 :(得分:1)

稀释!

您正在query类型的对象(名为test)上调用Parser。在幕后,python正在做什么,正在调用Parser.query(test)

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

正如其他人所说,将功能签名更改为def query(self)可以解决此问题

希望有所帮助