Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2017 00:10:22

Koala
Зарегистрирован: 2015-10-28
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

ООП это круто, однако если, например 10-20 классов по цепочке наследуют друг друга (с добавками какими-нибудь), то система будет тормозить.

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

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

может есть какие готовые пакеты или объяснения на эту тему?

Отредактировано Koala (Янв. 29, 2017 00:18:05)

Офлайн

#2 Янв. 29, 2017 01:27:32

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

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

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

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

p.s.
Мне кажется вы, как это говорят, залезли не в ту степь. Вопрос примерно такой. Вот я тут автомобиль проектирую, Я приделываю к жигулю 135 колес. Как вы обычно обеспечиваете чтобы они друг за друга не цеплялись и все касались земли? Я в недоумении я не то что десятикратного наследования,я максимум что видел в своей жизни ну наверное пятикратное. Опишите что у вас за задача, мы скорее посоветуем как сделать меньше классов.



Отредактировано doza_and (Янв. 29, 2017 01:32:04)

Офлайн

#3 Янв. 29, 2017 02:14:10

Koala
Зарегистрирован: 2015-10-28
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

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

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

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

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

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

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

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






Офлайн

#4 Янв. 29, 2017 09:30:27

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

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

По сути. Если существует необходимость в 20 уровнях наследования то эквивалентный неООП код будет разве что ещё более тяжелым.

Офлайн

#5 Янв. 29, 2017 10:14:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

Очевидно что если 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/).



Офлайн

#6 Янв. 29, 2017 13:36:22

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2823
Репутация: +  185  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

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

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

> для объекта я не могу сделать __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']



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Янв. 29, 2017 16:26:54

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

doza_and
Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
А как же виртуальные функции, вызов через vtable.

По теме: отношение наследования, это разбиение множества объектов на группы по каким-то признакам, т.е. классификация, примерно как в биологии. Двадцать уровней классификатора это очень много, это скорее всего ошибка проектирования.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Янв. 29, 2017 19:21:21

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

наследование классов/объектов как померять сколько и до каких пор

PooH
А как же виртуальные функции, вызов через vtable.
Может быть и вот так.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version