Форум сайта python.su
ООП это круто, однако если, например 10-20 классов по цепочке наследуют друг друга (с добавками какими-нибудь), то система будет тормозить.
Вопрос (1): можно ли как то померять время наследования на каждом классе/объекте (и даже занимаемую память)?
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?
вопрос (3): собственно у меня в конечном объекте есть метод, который наследуется непонятно у какого предка (т.е. не у прямого вышесидящего начальства предка) - как узнать у какого именно, не пересматривая лично все десятки прародителей/импортов в тексте модулей?
может есть какие готовые пакеты или объяснения на эту тему?
Отредактировано Koala (Янв. 29, 2017 00:18:05)
Офлайн
KoalaА откуда такой вывод? Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
то система будет тормозить.
KoalaОчевидно именно цепочку нельзя. Просто потому что это не цепочка. В питоне допустимо множественное наследование поэтому базовый класс может быть не один. Подробнее читайте что такое __mro__.
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?
KoalaВообще если вас интересует метод, то обычно открывают документацию и смотрят. Там написано не только где он определен (что никому не интересно), но самое главное для чего он нужен. Если вы открыли файл и увидели там вызов метода, то это не значит что он где-то определен в исходных текстах. Данное место может не достигаться во время работы программы, метод может быть создан во время выполнения программы и т.п.
как узнать у какого именно, не пересматривая лично все десятки прародителей/импортов
Отредактировано doza_and (Янв. 29, 2017 01:32:04)
Офлайн
doza_andНу, я же имею ввиду интерпретатор. Компилируемый С++ понятное дело будет все искать во время компиляции. А интерпретатор - же во время интертрепации??
Koala
то система будет тормозить.
=======================
А откуда такой вывод? Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
В так время измеряется также как и всегда см. профилирование программ на питоне.
doza_and
Koala
вопрос (2): можно ли узнать всю цепочку наследования до самого первого прародителя?
========================
Очевидно именно цепочку нельзя. Просто потому что это не цепочка. В питоне допустимо множественное наследование поэтому базовый класс может быть не один. Подробнее читайте что такое __mro__.
doza_andдокументации нет. А так да, обычно открывают и смотрят.
Вообще если вас интересует метод, то обычно открывают документацию и смотрят. Там написано не только где он определен (что никому не интересно), но самое главное для чего он нужен.
doza_andВ-общем Вы правы, но тут не я делаю, а мне дали уже такой автомобиль, у которого вместо задних колес 2 ноги динозавра и хвост, и говорят - разберись, как у него работают ноги, а то что-то двигатель работает, а ноги не идут.
Мне кажется вы, как это говорят, залезли не в ту степь. Вопрос примерно такой. Вот я тут автомобиль проектирую, Я приделываю к жигулю 135 колес.
….
Опишите что у вас за задача, мы скорее посоветуем как сделать меньше классов.
Офлайн
KoalaЗадача не вашего уровня, раз Вы жалуетесь.
А так да, обычно открывают и смотрят.
импортируются Сишные модули. дизСи-сировать пока не умею :-)
В-общем Вы правы, но тут не я делаю, а мне дали уже такой автомобиль, у которого вместо задних колес 2 ноги динозавра и хвост, и говорят - разберись, как у него работают ноги, а то что-то двигатель работает, а ноги не идут.
Офлайн
Очевидно что если 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)
KoalaВаши вопросы просто шокируют. Если вы можете посмотреть __mro__ то вы наверное стоите в отладчике в месте вызова функции, ну или встать туда не проблема. Что мешает вам шагнуть внутрь? Отладчик откроет файл в котором определена данная функция.
Класса-ближайшего-родителя, увидел я с помощью __mro__ его ромбовидную родословную (цепочку наследования). Где там будет мой метод, который я ищу?
Офлайн
> Ну, я же имею ввиду интерпретатор. Компилируемый С++ понятное дело будет все искать во время компиляции. А интерпретатор - же во время интертрепации??
Интерпретатор интерпретирует байт-код & АСТ там уже сделаны все предварительные действия.
> для объекта я не могу сделать __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']
Офлайн
doza_andА как же виртуальные функции, вызов через vtable.
Берем например C++. Поиск функций осуществляется во время компиляции. Наследование вообще не влияет на быстродействие.
Офлайн
PooHМожет быть и вот так.
А как же виртуальные функции, вызов через vtable.
Офлайн