Функции только становятся методами во времени выполнения. Таким образом, когда Вы добираетесь C.f
, Вы получаете связанную функцию (и C.f.im_class is C
). В то время, когда Ваша функция определяется, это - просто простая функция, это не связывается ни с каким классом. Эта несвязанная и разъединенная функция - то, что украшено регистратором.
self.__class__.__name__
даст Вам название класса, но можно также использовать дескрипторы для выполнения этого несколько более общим способом. Этот шаблон описан в сообщении в блоге на Декораторах и Дескрипторах , и реализация Вашего декоратора регистратора в особенности была бы похожа:
class logger(object):
def __init__(self, func):
self.func = func
def __get__(self, obj, type=None):
return self.__class__(self.func.__get__(obj, type))
def __call__(self, *args, **kw):
print 'Entering %s' % self.func
return self.func(*args, **kw)
class C(object):
@logger
def f(self, x, y):
return x+y
C().f(1, 2)
# => Entering >
, Очевидно, вывод может быть улучшен (при помощи, например, getattr(self.func, 'im_class', None)
), но этот общий шаблон будет работать и на методы и на функции. Однако это будет не работа для классов старого стиля (но просто не используйте тех;)
Я не знаю о IPC :: Dirqueue или beanstalkd, но у меня был хороший успех с распространением (либо с Spread , либо Spread :: Message модулей). Легко выполнять несколько процессов (с запущенным другим демоном) и одновременно работать с несколькими машинами. Приятно то, что, поскольку он основан на группах, вы можете легко подключить другого слушателя, если хотите делать такие вещи, как ведение журнала, статистика или отладка без необходимости изменять (или замедлять) ваши процессоры.