Форум сайта python.su
1. http://python.org/dev/peps/pep-3129/
2. Дерево вызовов? Мы одно и то же подразумеваем под “логированием”? Для меня это помимо всего прочего использование инфраструктуры стандартного пакета logging.
Офлайн
1. да, спасибо, тоже попробовал уже и такой синтаксис. буду разбираться во внутренностях.
2. logging используем. на выходе несколько видов логов, в том числе иерархический (на java-script кажется) html.
по нему приблизительно видно дерево вызовов и что творится внутри них.
не описывать же всевозможные применения логов…
Офлайн
каким образом, флаг _throw_exc_on_False или любой другой можно передать
class LoggedClass(type):
def __call__(cls, *args, **kargs):
if hasattr(cls, '_throw_exc_on_False'):
print getattr(cls, '_throw_exc_on_False')
return type.__call__(cls, *args, **kargs)
class CustomClass(object):
__metaclass__ = LoggedClass
_throw_exc_on_False = True
CustomClass()
Офлайн
shupgспасибо большое!каким образом, флаг _throw_exc_on_False или любой другой можно передатьclass LoggedClass(type):
def __call__(cls, *args, **kargs):
if hasattr(cls, '_throw_exc_on_False'):
print getattr(cls, '_throw_exc_on_False')
return type.__call__(cls, *args, **kargs)
class CustomClass(object):
__metaclass__ = LoggedClass
_throw_exc_on_False = True
CustomClass()
class LoggedClass(type):
def __call__(cls, *args, **kargs):
return type.__call__(cls, *args, **kargs)
class CustomClass(CustomClassBase, object):
__metaclass__ = LoggedClass
_throw_exc_on_False = True
CustomClass()
Офлайн
То, что вы написали — называется метаклассом, а не декоратором.
Избирательно метакласс не применяется. Зато внутри него в __init__/__new__ можно посмотреть, какой класс создается.
Если я правильно расшифровал вопрос. Это очень хитрый ход: говорить о CustomClassBase, не показывая его исходник при этом.
Офлайн
Понимаю, что это метакласс и в терминах python-а от декоратора он отличается,
но когда имеется ввиду шаблон декоратор, то смысл похож.
Python богат на технические трюки.
Вот я и интересуюсь нельзя ли сделать так,
чтобы действие метакласса не распространилось
на базовые классы, независимо от их содержания,
в случае когда необходимо и достаточно
применить его лишь к данному конкретному классу.
Если быть более точным, мне интересна возможность
декорирования только методов данного конкретного класса,
возвращающих только bool (True/False), что должно отличаться,
например, от просто целочисленного 0.
В целом, мне не очень важно каким именно методом воспользоваться
- метаклассом или декоратором для достижения конечной цели.
Расставлять декораторы вручную по всем методам класса не хочется,
потому что это более трудоемко, а так же подвержено ошибкам -
когда кто-то добавляет новый метод, он может забыть дописать перед ним декоратор.
Везде много примеров кода декоратора именно для функции в стиле
def decorator(f):
def func(*args, **kargs):
print 'executing %s...' % f.__name__
return f(*args, **kargs)
return func
Офлайн
klЭто как? Тип возвращаемого значения — динамически определяется. Что вернете, то и будет. В момент вызова.
Если быть более точным, мне интересна возможность
декорирования только методов данного конкретного класса,
возвращающих только bool (True/False), что должно отличаться,
например, от просто целочисленного 0.
Офлайн
Офлайн