class Parser():
html_escape_table = {
"&": "&",
'"': """,
"'": "'",
">": ">",
"<": "<",
}
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)
答案 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 = {
"&": "&",
'"': """,
"'": "'",
">": ">",
"<": "<",
}
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 = {
"&": "&",
'"': """,
"'": "'",
">": ">",
"<": "<",
}
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)
可以解决此问题
希望有所帮助