在课堂上使用瓶子时,为什么自我多余?

时间:2015-12-28 18:22:55

标签: python class bottle

我通常在裸脚本中使用bottle

import bottle

@bottle.route('/ping')
def ping():
    return "pong"

bottle.run()

一切正常,对http://127.0.0.1:8080/ping的调用会返回pong。我现在想要使用一个类来实现相同的功能:

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的调用现在返回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并且对应于没有参数'在方法的调用中?

1 个答案:

答案 0 :(得分:4)

那是因为瓶子不知道你传递的功能是一种方法,它没有方法的概念。另外,问问自己:瓶子应该自动创建实例吗?

如果要使用绑定实例方法,请改为:

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