Подклассы PyQt

Обычный способ использования виджетов Qt из Python, по-видимому, заключается в их подклассе.

Классы виджетов Qt имеют очень много методов, поэтому я неизбежно добавлю в подкласс метод с тем же именем, что и метод, унаследованный от виджета Qt. В Python все методы являются виртуальными, поэтому меня беспокоит то, что какой-то код Qt может в конечном итоге вызвать мой метод вместо ожидаемого Qt - в худшем случае нарушается какой-то пограничный случай, который нелегко показать в тестировании.

С другой стороны, возможно, все методы PyQt являются просто оболочками для кода C++, на который, конечно же, не повлияют все, что я делаю с точки зрения создания подклассов Python.

Кто-нибудь знает навскидку, в чем дело?


person rwallace    schedule 01.12.2009    source источник


Ответы (1)


Если лежащие в основе методы C++ являются виртуальными, переопределяющие их методы Python будут вызываться всякий раз, когда их вызывает код C++. Если это просто обычные методы, любой код C++ будет вызывать исходные методы C++ по умолчанию (хотя код Python будет вызывать методы Python, потому что он видит объект Python, и все методы там «виртуальные»).

person Lukáš Lalinský    schedule 01.12.2009
comment
Ах, PyQt зашел так далеко? Конечно, это хорошая новость в том случае, если вы хотите переопределить метод Qt, и плохая новость в случае, если вы этого не сделаете. Не лучше ли делегировать вместо подкласса? - person rwallace; 01.12.2009
comment
Если вы не хотите переопределять, дайте ему другое имя. Кстати, что вы подразумеваете под делегатом? - person Macke; 02.12.2009
comment
Почему бы просто не использовать PEP 8 и не называть все свои методы строчными буквами/символами подчеркивания? Qt использует camelCase, поэтому у вас не будет конфликтов... за исключением, возможно, имен методов из одного слова... - person Jesse Aldridge; 02.12.2009
comment
Я называю все свои методы строчными буквами, но есть несколько имен методов, состоящих из одного слова, достаточно, чтобы я не запомнил их все, оставляя в стороне возможность добавления большего количества в будущих версиях. Под делегатом я подразумеваю, что вместо того, чтобы ваш класс наследовал виджет, он должен содержать атрибут self.widget. - person rwallace; 02.12.2009
comment
Если вы хотите, чтобы он действовал как виджет, вы должны создать подкласс QWidget, так что у вас будет та же проблема. На самом деле нет никакого способа обойти это. На самом деле, просто дайте своим методам разные имена, сделайте их более конкретными и т.д. - person Lukáš Lalinský; 02.12.2009
comment
Я полагаю, вы могли бы принять соглашение о добавлении подчеркивания к именам ваших методов или что-то в этом роде. Хотя я обнаружил, что отладка такого рода конфликтов имен не так уж сложна, если вы знаете, что их нужно остерегаться. - person Jesse Aldridge; 03.12.2009
comment
Да, соглашение, к которому я пришел, состоит в том, чтобы начинать все имена моих методов (в классах, которые являются подклассами Qt, где я не пытаюсь переопределить унаследованный метод) с заглавной буквы. Таким образом, мне больше не нужно думать о проблеме. - person rwallace; 08.12.2009