为什么在 class 中使用 bottle 时 self 对于方法来说是多余的?
Why is self superfluous for a method when using bottle in a class?
我通常在裸脚本中使用bottle
:
import bottle
@bottle.route('/ping')
def ping():
return "pong"
bottle.run()
它工作正常,调用 http://127.0.0.1:8080/ping
returns pong
。我现在想使用 class 来实现相同的功能:
import bottle
class PingPong:
@bottle.route('/ping')
def ping(self):
return "pong"
def run(self):
bottle.run()
if __name__ == "__main__":
p = PingPong()
p.run()
现在对 http://127.0.0.1:8080/ping
的调用 returns 500
并且服务器上的回溯是
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\bottle.py", line 862, in _handle
return route.call(**args)
File "C:\Python34\lib\site-packages\bottle.py", line 1732, in wrapper
rv = callback(*a, **ka)
TypeError: ping() missing 1 required positional argument: 'self'
127.0.0.1 - - [28/Dec/2015 19:15:15] "GET /ping HTTP/1.1" 500 745
如果我从方法定义中删除 self
,服务器工作正常。
为什么在这种情况下 self 参数是多余的?这与默认传递 self 并对应方法调用中的 'no parameters' 的普通方法有何不同?
那是因为bottle不知道你传递的函数是方法,它没有方法的概念。另外,问问自己:bottle 应该自动创建实例吗?
如果您想使用绑定实例方法,请改为这样做:
class PingPong:
def ping(self):
return "pong"
def run(self):
bottle.route('/ping', callback=self.ping)
bottle.run()
if __name__ == "__main__":
p = PingPong()
p.run()
即实例初始化后,将绑定方法传递给route()
。
我通常在裸脚本中使用bottle
:
import bottle
@bottle.route('/ping')
def ping():
return "pong"
bottle.run()
它工作正常,调用 http://127.0.0.1:8080/ping
returns pong
。我现在想使用 class 来实现相同的功能:
import bottle
class PingPong:
@bottle.route('/ping')
def ping(self):
return "pong"
def run(self):
bottle.run()
if __name__ == "__main__":
p = PingPong()
p.run()
现在对 http://127.0.0.1:8080/ping
的调用 returns 500
并且服务器上的回溯是
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\bottle.py", line 862, in _handle
return route.call(**args)
File "C:\Python34\lib\site-packages\bottle.py", line 1732, in wrapper
rv = callback(*a, **ka)
TypeError: ping() missing 1 required positional argument: 'self'
127.0.0.1 - - [28/Dec/2015 19:15:15] "GET /ping HTTP/1.1" 500 745
如果我从方法定义中删除 self
,服务器工作正常。
为什么在这种情况下 self 参数是多余的?这与默认传递 self 并对应方法调用中的 'no parameters' 的普通方法有何不同?
那是因为bottle不知道你传递的函数是方法,它没有方法的概念。另外,问问自己:bottle 应该自动创建实例吗?
如果您想使用绑定实例方法,请改为这样做:
class PingPong:
def ping(self):
return "pong"
def run(self):
bottle.route('/ping', callback=self.ping)
bottle.run()
if __name__ == "__main__":
p = PingPong()
p.run()
即实例初始化后,将绑定方法传递给route()
。