我在尝试创建联合表生成器时出现语法错误。
这是被冒犯的翻译:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "federatedTableBuilder.py", line 7, in <module>
local_public_files.generate()
File "localViewDefinition.py", line 22, in generate
self.generate_for_host(conn)
File "localViewDefinition.py", line 17, in generate_for_host
self.conn.doQuery(rsaconn,self.query)
TypeError: doQuery() takes exactly 2 arguments (3 given)
和违规代码:
import mysql as sql
from connector import Connector
import io
import traceback
class LocalViewDefinition:
...insert variables...
def doQuery(connection, query):
try:
cursor = MySQLdb.cursors.Cursor(connection)
cursor.execute(query)
except: #figure out how to handle generic and sql errors separately
traceback.print_exc()
你对这个原因有什么看法吗?
答案 0 :(得分:4)
对于类方法,Python需要额外的第一个参数来引用类的实例。惯例是使用单词self
:
def doQuery(self, connection, query):
try:
cursor = MySQLdb.cursors.Cursor(connection)
cursor.execute(query)
except: #figure out how to handle generic and sql errors separately
traceback.print_exc()
这个引用类实例的要求是因为&#34; explicit比隐含&#34;更好。在Python中(参见import this
)。
答案 1 :(得分:2)
其他答案已经涵盖了这样一个事实,即您的实例方法需要self
1 作为第一个参数。但是,值得注意的是,不使用self
的实例方法可能根本不应该是实例方法...
class Example(object):
def instance_method(self):
print "I need self: %s" % self
@staticmethod
def static_method():
print "I don't need self."
@classmethod
def class_method(cls):
print "I use the class, not the instance: %s" % cls
Example.static_method() # I don't need self.
Example.class_method() # I use the class, not the instance: ...
e = Example()
e.instance_method() # I need self: ...
# can call staticmethods and classmethods from an instance as well:
e.static_method() # I don't need self.
最后,静态方法通常不是非常有用。大多数情况下,没有类的模块级函数会很好。
1 名称“self”只是惯例 - 你可以使用你喜欢的任何名字,但我不建议
答案 2 :(得分:0)
您需要添加另一个参数 - 将其命名为&#34; self&#34; - 在方法定义中。
def doQuery(self, connection, query)
答案 3 :(得分:0)
将自我添加到def doQuery(连接,查询)
def doQuery(self,connection,query):
这是python类对象引用。