2012-07-05 32 views
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(),并得到这个错误(这是将自我论证我所有的功能和对象的参数传递给我的分析器类后),类

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

一个类总是传递一个对自身的引用作为第一个参数。改变'query()'的定义为'def query(self):' –

+0

你应该阅读Python教程,它解释了所有这些。 – BrenBarn

+1

等待,如果'query'没有在Parser对象中使用任何东西,那么为什么你把它写成'Parser'的方法呢?为什么不把它作为函数保存在类之外的同一个文件中? – inspectorG4dget

回答

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 

编辑:

好进一步解释它,你必须知道如何蟒蛇处理的情况下,蟒蛇处理的非常详细和明确的方式的情况下,self总是被用来指代自己或这个当前实例,就像在Java中this。所以,当蟒蛇调用my_instance.method()其实际调用TheObject.method(my_instance)因此为什么自我是指方法内的my_instance。这允许您在方法内部使用实例本身传递给arugments的实例。

编辑2:

即使你有自我作为参数传递给你需要从一个实例调用它的方法,因此

my_parser = Parser() 
my_parser.method() 

编辑3:

这不是Java中,你不必你的功能结合在一起作为一个类内部的方法,只是让他们为自由漫游parser.py文件中的功能,那么你可以做

import parser 
parser.do_this() 
+1

你能否进一步解释这个概念?我不完全明白这一点。基本上,我调用方法的一个实例,我必须使用self来引用方法的实例,而不是实际的方法? –

+0

@AndrewAlexander试图更好地解释它 –

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

您的帖子已损坏。 –

+0

真的吗?我正在修复它... – C0deH4cker

+1

不要忘记编辑所有方法的参数。 –

1

啊!

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

这就是为什么当你写一个类中的方法,你应该始终包括self作为第一个参数。

正如其他人提及,改变你的函数签名def query(self)将解决这个问题

希望帮助

+0

呵呵,我只想打电话给Parser.query() –

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)。

+1

除非你在Python3那么'object'是内在的 –

+0

@JakobBowyer我以为我写的那种......那种...... – kratenko

+0

那么它不清楚足够在您的文章 –

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