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

 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. Названия классов, функций и переменных такие для примера .
FishHook
gmaksim
1 и 2) Где-то увидел пример с таким использованием (добавлением master), но если верить документации, метод можно вызывать и без аргументов (не считая self), зачем такая запись тогда?
А вы пробовали вызвать этот метод без параметров?

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

gmaksim
Можно ли таким образом использовать классы?
Каким “таким”? Объясните своими словами, что по-вашему такое ООП и зачем его придумали.
gmaksim
3) PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”
Хотя, возможно, это баг IDE.
FishHook
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 явно, и вас ИДЕ предупреждает, что тип объекта не тот.
gmaksim
FishHook
Это - не баг ИДЕ, я вам уже объяснил, вы не понимаете глобального смысла self.
Не увидел ваше сообщение.
Обмозгую и напишу, спасибо.
gmaksim
Про вопрос 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
Исправил:
 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_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB