crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> ООП в Python, а есть ли?
Litkevich Yuriy
  опции профиля:
сообщение 14.11.2010, 18:37
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Вроде ООП в питоне есть, и вроде наследование есть.

Но почему-то наталкиваюсь на проблему:
class SubClass(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        # ...
        method(args)
где method(args) - это метод базового класса или ещё дальше по иерархии.
При таком варианте получаю ошибку:
Цитата
NameError: global name 'method' is not defined

почему?

неужели нужно писать имя базового класса перед методом и, как следствие, всё время помнить в каком из родительских классов этот метод был введён?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 14.11.2010, 22:14
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(Litkevich Yuriy @ 14.11.2010, 19:37) *
Вроде ООП в питоне есть, и вроде наследование есть.

Но почему-то наталкиваюсь на проблему:
class SubClass(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        # ...
        method(args)
где method(args) - это метод базового класса или ещё дальше по иерархии.
При таком варианте получаю ошибку:
Цитата
NameError: global name 'method' is not defined

почему?

неужели нужно писать имя базового класса перед методом и, как следствие, всё время помнить в каком из родительских классов этот метод был введён?


В отличие от C++ питон не подставляет по умолчанию self(сишный this). Т.е. правильно вызывать надо так:
lass SubClass(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        self.method(args)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.11.2010, 22:52
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


class Qt5WayButton(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        sp = QSizePolicy();
        sp.setHeightForWidth(True);
        setSizePolicy(sp);
этот код даёт такую ошибку:
Цитата
setSizePolicy(sp);
NameError: global name 'setSizePolicy' is not defined


Цитата(Litkevich Yuriy @ 15.11.2010, 2:33) *
setSizePolicy(sp);
это метод QWidget-а, так как к нему обращатся?
например на update() подобной ругани я не видел

Цитата(Litkevich Yuriy @ 15.11.2010, 2:35) *
например на update() подобной ругани я не видел
не на него тоже ругается.

так унаследованные методы нужно вызывать как свои собственные, вроде интерпретатор перестаёт ругаться.

А как быть с методами базового класса, вроде следуя аналогии в конструкторе:
Цитата
BaseClass.__init__(self)
я делаю тоже для другого метода:
...
    def resizeEvent(self, event):
        # update masks
        self.m_upButton.updateMask();
        self.m_downButton.updateMask();
        self.m_leftButton.updateMask();
        self.m_rightButton.updateMask();
        self.m_centerButton.updateMask();

        QWidget.resizeEvent(event);
и получаю такую ошибку:
Цитата
QWidget.resizeEvent(event);
TypeError: descriptor 'resizeEvent' requires a 'PySide.QtGui.QWidget' object but received a 'PySide.QtGui.QResizeEvent'


сообщения об ошибке я вообще не понимаю.
descriptor - описатель, причём здесь описатель?
requires - требует, что значит требует? в качестве аргумента?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.11.2010, 23:40
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Litkevich Yuriy @ 15.11.2010, 2:52) *
QWidget.resizeEvent(event);
эту штуку победил.
Нужно так вызывать метод базового класса:
QWidget.resizeEvent(self, event);
, т.е. передавать все аргументы, в том числе и ссылку на экземпляр класса (здесь self)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 5:26