Уведомления

Группа в Telegram: @pythonsu

#1 Июль 25, 2017 10:02:21

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов в классах

Прочел разные статьи на тему “конструктора класса”, но никак не могу уловить, корректен ли такой код (или его необходимо писать как-то по другому):

 class Test1:  
    def __init__(self, master):  # 1
        self.master = master  # 2
 
    def do_something(self, x, y):
        # some code
 class Test2:  
    def __init__(self, master):
        self.master = master
    def do_something_2(self):  
        Test1.do_something(self, x=1, y=2)  # 3
 if __name__ == "__main__":
    Test2.do_something2()  

Что не могу взять в толк и буду рад вашей поддержке:
1 и 2) Где-то увидел пример с таким использованием (добавлением master), но если верить документации, метод можно вызывать и без аргументов (не считая self), зачем такая запись тогда?
3) PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”, при этом убирая self, код разумеется не работает.
4) Можно ли таким образом использовать классы? В моем случае в Test1 будут функции для размещения GUI, а Test2 вызов собственно данного GUI и добавление логики. Далее уже будут классы Test3, Test4 для других режимов работы, но для них также потребуется класс для размещения GUI (Test1).
Спасибо.

p.s. Названия классов, функций и переменных такие для примера .

Отредактировано gmaksim (Июль 25, 2017 16:25:00)

Офлайн

#2 Июль 25, 2017 10:14:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вызов методов в классах

gmaksim
1 и 2) Где-то увидел пример с таким использованием (добавлением master), но если верить документации, метод можно вызывать и без аргументов (не считая self), зачем такая запись тогда?
А вы пробовали вызвать этот метод без параметров?

gmaksim
PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”, при этом убирая self, код разумеется не работает.
И это логично. self - это ссылка на объект, чего вы хотите передавая ссылку на объект типа Test2 в метод типа Test1?

gmaksim
Можно ли таким образом использовать классы?
Каким “таким”? Объясните своими словами, что по-вашему такое ООП и зачем его придумали.



Офлайн

#3 Июль 25, 2017 10:15:10

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов в классах

3) PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”
Хотя, возможно, это баг IDE.

Офлайн

#4 Июль 25, 2017 10:37:32

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вызов методов в классах

gmaksim
Хотя, возможно, это баг IDE.
Это - не баг ИДЕ, я вам уже объяснил, вы не понимаете глобального смысла self.
Методы - это просто функции, они ничем кардинально от функций не отличаются. Как метод-функция должна “узнать” в контексте какого именно объекта она вызывается? Вы, видимо, как и многие новички полагаете, что для каждого объекта в памяти создается все содержимое класса, все методы и атрибуты копируются для каждого вновь созданного объекта. Но это не так.

 class Foo:
    def method(self):
        print(self)
f1 = Foo()
f2 = Foo()
f1.method()
f2.method()
f1.method(), f2.method() - здесь вызывается одна и та же функция определенная в классе Foo, и в эту функцию неявно передается объект. В первом случае f1, во втором - f2. Это и есть self. Вы в своем примере передаете self явно, и вас ИДЕ предупреждает, что тип объекта не тот.



Офлайн

#5 Июль 25, 2017 13:27:19

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов в классах

FishHook
Это - не баг ИДЕ, я вам уже объяснил, вы не понимаете глобального смысла self.
Не увидел ваше сообщение.
Обмозгую и напишу, спасибо.

Офлайн

#6 Июль 25, 2017 16:07:20

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов в классах

Про вопрос 1) 2) в начале топика разобрался, написал глупость.
Вроде как понимаю, о чем вы, судя по всему в моем примере выше я не правильно вызвал саму функцию.

 class Arrange(QWidget):
    def __init__(self):
        super().__init__()
    def labels(self, list, step_down):
        start = 0
        stop = len(list)
        step = 30
        labels_gc = []
        while start != stop:
            label_name = QLabel(list[start], self)     # com1
            label_name.move(10, step)
            labels_gc.append(label_name)
            start += 1
            step += step_down
            label_name.show()
class Add(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 600, 700)
        self.setWindowTitle('Test')
        self.show()
        test_n = ['test1', 'test2', 'test3', 'test4']
        Arrange.labels(self, list=test_n, step_down=25)  # var 1
        qwe = Arrange()                              # var 2
        qwe.labels(list=test_n, step_down=25)
if __name__ == "__main__":
    root = QApplication(sys.argv)
    something = Add()
    sys.exit(root.exec_())

В случае с var 1 - ругается на self, код примерно такой (отвечая на ваш вопрос):
FishHook
self - это ссылка на объект, чего вы хотите передавая ссылку на объект типа Test2 в метод типа Test1?
Если применить var 2 (var 1 разумеется убираем), что есть правильно судя по всему, то тогда label буду отображаться в рамках класса Arrange, и например задавая напрямую вместо self (в com1) скажем root то выпадает ошибка и не могу понять, что не так? (В tkinter можно было указывать таким образом, где размещать. Выходит я не правильно задаю параметр pyqt и/или не так использую вызов функции из другого класса?)

Отредактировано gmaksim (Июль 25, 2017 16:23:01)

Офлайн

#7 Июль 25, 2017 16:32:47

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов в классах

Исправил:

 class Arrange(QWidget):
    def __init__(self):
        super().__init__()
    def labels(self, list, step_down, place):  # FIX
        start = 0
        stop = len(list)
        step = 30
        labels_gc = []
        while start != stop:
            label_name = QLabel(list[start], place)    # FIX
            label_name.move(10, step)
            labels_gc.append(label_name)
            start += 1
            step += step_down
            label_name.show()
class Add(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 600, 700)
        self.setWindowTitle('Test')
        self.show()
        test_n = ['test1', 'test2', 'test3', 'test4']
        qwe = Arrange()                              
        qwe.labels(list=test_n, step_down=25, place=self)  # FIX
if __name__ == "__main__":
    root = QApplication(sys.argv)
    something = Add()
    sys.exit(root.exec_())

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version