kb
20.09.2011 11:50
Помогите, пожалуйста.
Хотел сделать такой крутой класс, над которым можно сделать
someval = ObjLogger(someval, 'someval')
somval.dosomething(a='b')
и потом после выполнения этого кода оно будет печатать:
- [getattr] someval.dosomething
- [attr_call] someval.dosomething(a='b')
это я уже сделал. но вот теперь хочу сделать, чтоб работало:
class A(str): pass
a = A()
a = ObjLogger(a) # оборачиваем в логировалку
assert(isinstance(a, basestring))
Короче говоря, мне нужно такое, чтоб как ABCMeta, только в другую сторону (ну, или вы поняли).
спасибо.
p.s.: или можно придумать извращение с __bases__?
http://docs.python.org/reference/datamod... не это?
блеа, тебе наоборот надо
Ну, ты извращением занимаешься. Чем тебе метаклассы не нравятся, не понимаю.
Попробуй декоратор.
ему надо вундервафлю, которая сама отдекорирует всё, что движется
Тупо переопределить оператор точка в ObjLogger, логировать и делать super
> оператор точка
> оператор точка
У тебя каша в голове
Я знаю, но меня поняли.
Кстати, да, можно при создании провести интроспекцию и задекорировать все функции, что есть в объекте.
Я, кажется, не тот вопрос решаю, но ладно.
при чем тут метаклассы не понял
ну как причём. Фигачишь своему классу заранее заготовленный метакласс, который при вызове метода будет срать в логи, профит
почти. короче решением будет, наверное, тупо манкипатчинг __getattr__ и подобных методов. обезьяны наше всё.
Нет, не проще. В моем случае у тебя получится 5-7 строчек. В твоем гораздо больше.
ну так это не мой класс. у меня объект есть, я хочу его отлогировать. объект чей угодно (внешней библиотеки, etc.)
мне надо отлогировать все __getattr__, все вызовы функций, возможно другие магические методы. плюс если добавится новое свойство объекта его уже никто не задекорирует. твое решение не проще, оно слегка "неправильное" (но в некоторых случаях задачу решит, возможно)