Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2013 13:56:10

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов метода просто и через super()

Сижу туплю над простейшей вещью. Есть два класса, один наследуется от другого (REST-хэндлеры с методами GET, POST, PUT и т.д.). И в наследнике, и в родителе внутри метода вызывается проверка. Проблема в том, что если в наследнике сделать проверку, а потом позвать super() на тот же обработчик родителя - выйдет фигня, потому что тот запустит свою проверку, которая уже не пройдет.

Вот пример кода:

# -*- coding: utf-8 -*-
class ProviderHandler(JSONHandler):
    @classmethod
    def check(cls, cluster):
        if cluster.provider != cls.provider:
            raise Exception()
class FirstHandler(ProviderHandler):
    provider = "first"
    def PUT(self, cluster_id):
        cluster = self.get_object_or_404(Cluster, cluster_id)
        self.check(cluster)  # this is the check
        #  lots of code here - copy-paste is not suitable solution
class SecondHandler(FirstHandler):
    provider = "second"
    def PUT(self, cluster_id):
        cluster = self.get_object_or_404(Cluster, cluster_id)
        self.check(cluster)  # this is the check 2
        super(
            SecondHandler,
            self
        ).PUT(cluster_id)

Как сделать правильнее и красивее?



Отредактировано Enchantner (Окт. 31, 2013 13:57:06)

Офлайн

#2 Окт. 31, 2013 14:08:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вызов метода просто и через super()

Enchantner
# lots of code here - copy-paste is not suitable solution
Завернуть в def do_something(…
и вызывать в нужных местах.

А зачем вы check в @classmethod “завернули”?

Офлайн

#3 Окт. 31, 2013 14:11:57

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов метода просто и через super()

o7412369815963
Тут это огрызок из кода, там еще много чего. Действительно, classmethod тут не нужен.

Спасибо за ответ, просто затупил вдруг, хотел уже в гугле искать, как внутри метода отличить, вызван он просто или через super().



Отредактировано Enchantner (Окт. 31, 2013 14:17:05)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version