Предположим, что у меня есть функция, которая генерирует функцию маршрутизатора, который вызывающую предопределенные функции обратного вызова в зависимости от того, является ли число четным или нечетным:Повторное использование глобальной функции в пределах класса декоратора
def odd_even_router(odd, even):
def r(n):
if n % 2:
odd(n)
else:
even(n)
return r
У меня также есть класс декоратора что придает подобный метод маршрутизатор, названный check_number
, к классу:
def attach_default_router(cls):
def route(self, n):
if n % 2:
self.on_odd(n)
else:
self.on_even(n)
cls.check_number = route
return cls
Затем класс украшен @attach_default_router
имеет check_number()
определен автоматически, и только должен реализовать on_odd()
и on_even()
:
@attach_default_router
class A(object):
def on_odd(self, n):
print 'Odd number'
def on_even(self, n):
print 'Even number'
Если я хочу, чтобы повторно использовать odd_even_router()
, функция маршрутизатора генератор, внутри attach_default_router()
, я могу это сделать:
def attach_default_router(cls):
def route(self, n):
r = odd_even_router(self.on_odd, self.on_even)
r(n)
cls.check_number = route
return cls
Однако нежелательный эффект, что, каждый раз, когда check_number()
получает , генерируется новая (но идентичная) функция маршрутизатора. Итак, вот мой вопрос: Как я могу использовать генератор odd_even_router()
внутри декоратора attach_default_router()
, но без генерации новой функции маршрутизатора каждый раз?
Проблемы в сердце: odd_even_router()
возвращает функцию, которая принимает один аргумент, но check_number()
, будучи методом экземпляра, необходимо два (первый объект self
). Если я не получу self
, я пока не могу создать функцию маршрутизатора. Когда я получаю self
, я уже вхожу в метод, и генерирование его там генерирует каждый раз, когда вызывается метод.
Как я могу решить эту дилемму?
Вы считали использование миксинов вместо декораторов класса? –
Спасибо, что ознакомили меня с термином «mixin». Посмотрев на него, я бы сказал, что это просто множественное наследование. Ну, я рассматривал множественное наследование, но у меня есть (несколько иррациональная) невзгод. В моем случае классы, которые будут украшены, являются продолжениями от некоторых других классов, поэтому мой инстинкт состоит в том, чтобы избежать наследования более чем одного. Но да, это вариант. Я запомню это. –