@Mariik

Как вместо функции использовать метод класса в микрофрєймворке Bottle?

В общем что я хочу - подставить декоратору роута

@route('/hello')
test.test_method()


не функцию, а вызов метода на объекте класса. Для пример чуток кода:

from bottle import route, run

class test():

    def g_test(self):
        return "<h1> Hello from test method! </h1>"

t = test()

@route('/test')
t.g_test()

run(host='localhost', port=8080)


Но тут я получаю синтаксический эррор

Ок, если декорировать сам метод:

from bottle import route, run, template

class test():
    @route('/hello')
    def getRes(self=None):
        return "<h1> Hello from test method! </h1>"

t = test()

run(host='localhost', port=8080,debug=True)


Все сработает, но Self не определен, а без него никакого смысла... Неужели эту ситуацию не исправить?
Я лично вижу только 2 варианта и оба "кривые"

1 - Развернуть декоратор:

app.route('/', method='GET', callback=t.getRes())

2 - Обернуть вызов метода в функцию

@route('/test')
def view():
    t = test()
    return t.getRes()


Есть ли нормальный способ использовать методы класса?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
@Mariik Автор вопроса
Вчера напряг этим вопросом Marcel Hellkamp - автора фрэймворка. Вот его ответ:

class Klass:
    def method(self):
        pass

obj = Klass()
route('/foo', callback=obj.method)
# or
route('/foo')(obj.method)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
yokotoka
@yokotoka
Python guru
А в чём проблема сделать

t = test()
@route('/test')
def test():
    return t.getRes()

?

С декорированием метода - вам достаточно написать промежуточный декоратор, который использует внутри декоратор route и делает всё как надо, в т.ч. прокинет self.

Кстати, почему bottle, а не flask? Сам как-то юзал первый, но потом понял, что преимуществ у него перед вторым нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы