Найти - Пользователи
Полная версия: наследование классов/объектов как померять сколько и до каких пор
Начало » Python для новичков » наследование классов/объектов как померять сколько и до каких пор
1
Koala
ООП это круто, однако если, например 10-20 классов по цепочке наследуют друг друга (с добавками какими-нибудь), то система будет тормозить.

Вопрос (1): можно ли как то померять время наследования на каждом классе/объекте (и даже занимаемую память)?
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?

вопрос (3): собственно у меня в конечном объекте есть метод, который наследуется непонятно у какого предка (т.е. не у прямого вышесидящего начальства предка) - как узнать у какого именно, не пересматривая лично все десятки прародителей/импортов в тексте модулей?

может есть какие готовые пакеты или объяснения на эту тему?
doza_and
Koala
то система будет тормозить.
А откуда такой вывод? Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
В так время измеряется также как и всегда см. профилирование программ на питоне.

Koala
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?
Очевидно именно цепочку нельзя. Просто потому что это не цепочка. В питоне допустимо множественное наследование поэтому базовый класс может быть не один. Подробнее читайте что такое __mro__.

Koala
как узнать у какого именно, не пересматривая лично все десятки прародителей/импортов
Вообще если вас интересует метод, то обычно открывают документацию и смотрят. Там написано не только где он определен (что никому не интересно), но самое главное для чего он нужен. Если вы открыли файл и увидели там вызов метода, то это не значит что он где-то определен в исходных текстах. Данное место может не достигаться во время работы программы, метод может быть создан во время выполнения программы и т.п.
А вообще любая IDE и большая часть текстовых редакторов реализуют функцию - перейти к определению (другое дело что успех не гарантирован)

p.s.
Мне кажется вы, как это говорят, залезли не в ту степь. Вопрос примерно такой. Вот я тут автомобиль проектирую, Я приделываю к жигулю 135 колес. Как вы обычно обеспечиваете чтобы они друг за друга не цеплялись и все касались земли? Я в недоумении я не то что десятикратного наследования,я максимум что видел в своей жизни ну наверное пятикратное. Опишите что у вас за задача, мы скорее посоветуем как сделать меньше классов.
Koala
doza_and
Koala
то система будет тормозить.
=======================
А откуда такой вывод? Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
В так время измеряется также как и всегда см. профилирование программ на питоне.

Ну, я же имею ввиду интерпретатор. Компилируемый С++ понятное дело будет все искать во время компиляции. А интерпретатор - же во время интертрепации??

doza_and
Koala
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?
========================
Очевидно именно цепочку нельзя. Просто потому что это не цепочка. В питоне допустимо множественное наследование поэтому базовый класс может быть не один. Подробнее читайте что такое __mro__.

для объекта я не могу сделать __mro__, только для класса.
Как раз для объекта я могу сделать isinstance, и по крайней мере узнать, что какой-то объект таки в предках есть, но не более.
Ну, хорошо, добрался я до Класса-ближайшего-родителя, увидел я с помощью __mro__ его ромбовидную родословную (цепочку наследования). Где там будет мой метод, который я ищу?

doza_and
Вообще если вас интересует метод, то обычно открывают документацию и смотрят. Там написано не только где он определен (что никому не интересно), но самое главное для чего он нужен.
документации нет. А так да, обычно открывают и смотрят.
импортируются Сишные модули. дизСи-сировать пока не умею :-)

doza_and
Мне кажется вы, как это говорят, залезли не в ту степь. Вопрос примерно такой. Вот я тут автомобиль проектирую, Я приделываю к жигулю 135 колес.
….
Опишите что у вас за задача, мы скорее посоветуем как сделать меньше классов.
В-общем Вы правы, но тут не я делаю, а мне дали уже такой автомобиль, у которого вместо задних колес 2 ноги динозавра и хвост, и говорят - разберись, как у него работают ноги, а то что-то двигатель работает, а ноги не идут.

Увы, подробнее описать не могу.






Shaman
Koala
А так да, обычно открывают и смотрят.
импортируются Сишные модули. дизСи-сировать пока не умею :-)
В-общем Вы правы, но тут не я делаю, а мне дали уже такой автомобиль, у которого вместо задних колес 2 ноги динозавра и хвост, и говорят - разберись, как у него работают ноги, а то что-то двигатель работает, а ноги не идут.
Задача не вашего уровня, раз Вы жалуетесь.

По сути. Если существует необходимость в 20 уровнях наследования то эквивалентный неООП код будет разве что ещё более тяжелым.
doza_and
Очевидно что если 10 уровней наследования то это более 1000 классов :) Проект размером PyQt или скорее всего больше. Даже любопытно что это за проект, киньте ссылку если это возможно.

Рекомендация 0.
Если по нему нет документации то я обычно советую такой проект выбросить и сделать все с нуля. С такого проекта только отдельные огрызки можно использовать.

Рекомендация 1.
Koala
для объекта я не могу сделать __mro__, только для класса.
 class Ta:
    "class doc"
    def a(self):
        "class method doc"
        pass
    def b(self):
        pass
obj = Ta()
print(obj.__class__)
print(dir(obj))
print(obj.__dict__)
help(obj)
help(Ta)
Это самые самые основы языка которые в учебниках по питону на первых 5 страницах объясняют. Если у вас есть живой объект то вы полную информацию можете получить, класс данного объекта, списки методов и полей, модули где все это определено, базовые классы, стек вызова и т.п. и т.д. Просто прочитайте документацию по языку или любой учебник раздел по интроспекции.

Можете написать вспомогательные функции которые будут выдавать нужную именно вам информацию.

Рекомендация 2.
Koala
Класса-ближайшего-родителя, увидел я с помощью __mro__ его ромбовидную родословную (цепочку наследования). Где там будет мой метод, который я ищу?
Ваши вопросы просто шокируют. Если вы можете посмотреть __mro__ то вы наверное стоите в отладчике в месте вызова функции, ну или встать туда не проблема. Что мешает вам шагнуть внутрь? Отладчик откроет файл в котором определена данная функция.

Поставьте pycharm Он будет сканировать исходники и будет подсказывать где что, предоставит GUI отладчик.

Рекомендация 3.

На начальных этапах в сложных проектах иногда помогает дока с перекрестными ссылками. Насколько помню doxigen (http://www.stack.nl/~dimitri/doxygen/) может зажевать питоновский код ну и sphinx тоже неплохой инструмент (http://www.sphinx-doc.org/en/stable/).

Rodegast
> Ну, я же имею ввиду интерпретатор. Компилируемый С++ понятное дело будет все искать во время компиляции. А интерпретатор - же во время интертрепации??

Интерпретатор интерпретирует байт-код & АСТ там уже сделаны все предварительные действия.

> для объекта я не могу сделать __mro__, только для класса.

Функция type возвращает класс объекта.

> Где там будет мой метод, который я ищу?
 >>> class A(object):
...     def s(self): pass
 
>>> class B(object):
...     def d(self): pass
 
>>> class C(A, B):
...     pass
 
>>> C.mro()
[<class '__console__.C'>, <class '__console__.A'>, <class '__console__.B'>, <type 'object'>]
>>> filter(lambda x: x.find("_") == -1, dir(C.mro()[1]))
['s']
PooH
doza_and
Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
А как же виртуальные функции, вызов через vtable.

По теме: отношение наследования, это разбиение множества объектов на группы по каким-то признакам, т.е. классификация, примерно как в биологии. Двадцать уровней классификатора это очень много, это скорее всего ошибка проектирования.
Shaman
PooH
А как же виртуальные функции, вызов через vtable.
Может быть и вот так.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB