LINUX.ORG.RU

А как заставить класс выводит свое имя при создании?

 ,


1

2

Это в продолжении предыдущей темы про 400 000 строк питоновского кода. Надо чтобы объекты, при создании, выводили свое имя. Это нужно для того, чтобы во всей этой простыне найти и изменить некоторый функционал.

Пока склоняюсь к написанию скрипта, который находит все *.py, при чтении файла запоминает его имя, и в __init__ сует print имя_класса.

Есть идеи по лучше?

Deleted

Ответ на: комментарий от habamax

monkey patching

Скорее всего, нет. Я даже не знаю какие классы отвечают за нужный мне функционал, не говоря уже о методах. Да и перепиливать все мне не надо, нужно лишь дополнить уже существующие функции.

Deleted
()
Ответ на: комментарий от Deleted

Я даже не знаю какие классы отвечают за нужный мне функционал, не говоря уже о методах.

Уже бы давно исходники открыл, да со всем бы разобрались.

Siado ★★★★★
()
Ответ на: комментарий от Deleted

Тебе намекают на то, что правильно говорить функциональность, а функционал - это совсем другое.

templarrr ★★★★★
()
Ответ на: комментарий от Siado

Уже бы давно исходники открыл, да со всем бы разобрались.

Дык от меня же это не зависит, мог бы, открыл :(

Deleted
()

по лучше

пиши в stderr, вместо stdout

wakuwaku ★★★★
()
Ответ на: комментарий от Siado

Ок, но это аж через две недели будет. В отпуск ушли.

Deleted
()
Ответ на: комментарий от i-rinat

Видимо, подошло бы, если бы не создавало 1500 файлов. При чем, оно их создает только после закрытия программы, что тоже не радует.

Мне бы последовательный вывод в консольку, чтобы видить какие объекты создаются.

Deleted
()
Ответ на: комментарий от Deleted

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

python -m trace --trace /usr/share/wicd/gtk/wicd-client.py | grep __init__ 
i-rinat ★★★★★
()

Имя класса это self.__class.__name__

Имя инстанса так просто не получишь. Можешь использовать модуль inspect, я такое как-то делал, в инете есть уже готовые примеры. Но только не пускай это в продакшн.

true_admin ★★★★★
()
Ответ на: комментарий от Siado

Уже бы давно исходники открыл

Ага, а потом будут говорить что опенсурц это говнокод :).

true_admin ★★★★★
()
Ответ на: комментарий от i-rinat

О, спасибо, почти то, что нужно :)

Видимо, скриптик все равно писать прийдется, чтобы меньшие объемы информации в консольку выводить.

Deleted
()
Ответ на: комментарий от true_admin

Имя класса это self.__class.__name__

О, это то, что нужно! Только оно не работает что то:

>>> Traceback (most recent call last):
  File "HospitalBeds\HospitalBedsDialog.py", line 295, in on_tblPresence_doubleClicked
    self.on_actOpenEvent_triggered()
  File "HospitalBeds\HospitalBedsDialog.py", line 2098, in on_actOpenEvent_triggered
    dialog = formClass(self)
  File "F003\F003Dialog.py", line 67, in __init__
    self.setupUi(self)
  File "F003\Ui_F003.py", line 278, in setupUi
    self.tabStatus = CActionsPage()
  File "Events\ActionsPage.py", line 42, in __init__
    print self.__class.__name__
RuntimeError: super-class __init__() of type CActionsPage was never called
Использую так:
class CActionsPage(QtGui.QWidget, CConstructHelperMixin, Ui_ActionsPageWidget):
    def __init__(self, parent=None):
        print self.__class.__name__
        ...

Deleted
()
Ответ на: комментарий от true_admin

А, блин, точно. Клево, это сильно облегчило задачу, спасибо.

Deleted
()
Ответ на: комментарий от i-rinat

Кстати, sloccount что на это говорит?

Да лень заморачиваться, я сегодня что то вообще халявлю, надо поработать.

Deleted
()
class Object(object):
    def __new__(cls):
        print "created instanse of class <%s>" % cls.__name__
        return super(Object, cls).__new__(cls)

import __builtin__;__builtin__.object = Object;del __builtin__

Добавляешь эти строки в начало стартового модуля проекта, и все объекты, классы которых наследуются от object (а по уму таковыми должны быть все классы), будут писать о своем создании в sys.stdout.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.