Форум сайта python.su
Прочел разные статьи на тему “конструктора класса”, но никак не могу уловить, корректен ли такой код (или его необходимо писать как-то по другому):
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()
Отредактировано gmaksim (Июль 25, 2017 16:25:00)
Офлайн
gmaksimА вы пробовали вызвать этот метод без параметров?
1 и 2) Где-то увидел пример с таким использованием (добавлением master), но если верить документации, метод можно вызывать и без аргументов (не считая self), зачем такая запись тогда?
gmaksimИ это логично. self - это ссылка на объект, чего вы хотите передавая ссылку на объект типа Test2 в метод типа Test1?
PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”, при этом убирая self, код разумеется не работает.
gmaksimКаким “таким”? Объясните своими словами, что по-вашему такое ООП и зачем его придумали.
Можно ли таким образом использовать классы?
Офлайн
3) PyCharm подчеркивает self в данной строке выводя “expected type ‘Test’ got ‘Test2’ instead”Хотя, возможно, это баг IDE.
Офлайн
gmaksimЭто - не баг ИДЕ, я вам уже объяснил, вы не понимаете глобального смысла self.
Хотя, возможно, это баг IDE.
class Foo: def method(self): print(self) f1 = Foo() f2 = Foo() f1.method() f2.method()
Офлайн
FishHookНе увидел ваше сообщение.
Это - не баг ИДЕ, я вам уже объяснил, вы не понимаете глобального смысла self.
Офлайн
Про вопрос 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_())
FishHookЕсли применить var 2 (var 1 разумеется убираем), что есть правильно судя по всему, то тогда label буду отображаться в рамках класса Arrange, и например задавая напрямую вместо self (в com1) скажем root то выпадает ошибка и не могу понять, что не так? (В tkinter можно было указывать таким образом, где размещать. Выходит я не правильно задаю параметр pyqt и/или не так использую вызов функции из другого класса?)
self - это ссылка на объект, чего вы хотите передавая ссылку на объект типа Test2 в метод типа Test1?
Отредактировано gmaksim (Июль 25, 2017 16:23:01)
Офлайн
Исправил:
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_())
Офлайн