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__?

2. odinodin /1 20.09.2011 11:54

блеа, тебе наоборот надо

3. werehuman 20.09.2011 11:56

Ну, ты извращением занимаешься. Чем тебе метаклассы не нравятся, не понимаю.

4. SirAnthony 20.09.2011 12:04 home

Попробуй декоратор.

5. werehumanSirAnthony /4 20.09.2011 12:05 Psi+

ему надо вундервафлю, которая сама отдекорирует всё, что движется

6. SirAnthonywerehuman /5 20.09.2011 12:08 home

Тупо переопределить оператор точка в ObjLogger, логировать и делать super

7. werehumanSirAnthony /6 20.09.2011 12:09 Psi+

> оператор точка
> оператор точка
У тебя каша в голове

8. SirAnthonywerehuman /7 20.09.2011 12:10 home

Я знаю, но меня поняли.

9. SirAnthony 20.09.2011 12:22 home

Кстати, да, можно при создании провести интроспекцию и задекорировать все функции, что есть в объекте.

10. SirAnthonySirAnthony /9 20.09.2011 12:23 home

Я, кажется, не тот вопрос решаю, но ладно.

11. kbwerehuman /3 20.09.2011 16:01

при чем тут метаклассы не понял

12. werehumankb /11 20.09.2011 16:02 Psi+

ну как причём. Фигачишь своему классу заранее заготовленный метакласс, который при вызове метода будет срать в логи, профит

13. kbSirAnthony /9 20.09.2011 16:02

почти. короче решением будет, наверное, тупо манкипатчинг __getattr__ и подобных методов. обезьяны наше всё.

14. SirAnthonykb /13 20.09.2011 16:04 home

Нет, не проще. В моем случае у тебя получится 5-7 строчек. В твоем гораздо больше.

15. kbwerehuman /12 21.09.2011 08:08

ну так это не мой класс. у меня объект есть, я хочу его отлогировать. объект чей угодно (внешней библиотеки, etc.)

16. kbSirAnthony /14 21.09.2011 08:09

мне надо отлогировать все __getattr__, все вызовы функций, возможно другие магические методы. плюс если добавится новое свойство объекта его уже никто не задекорирует. твое решение не проще, оно слегка "неправильное" (но в некоторых случаях задачу решит, возможно)

Do you really want to delete ?