Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33

Что-то я не понимаю.Вызов метода одного класса из другого класса

21.09.2019, 08:28. Показов 8734. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два класса первый содержит атрибуты объекта описывающие кнопку: имя, позиция, размер и тд... А так же содержит набор методов для изменения этих атрибутов. Второй класс содержит атрибуты объекта описывающие список кнопок: список кнопок, фокус. Отношение между объектами типа "имеет", т.е. список кнопок имеет кнопки.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Button:
    def __init__(self, name='кнопка', pos=(0, 0), width=100, height=50, color=(150, 150, 150), text_color=(0, 0, 0),
                 frame_color=(150, 150, 150)):
        self.name = name
        # Координаты
        self.pos = pos
        self.width = width
        self.height = height
        # Поверхность кнопки
        self.surface = pygame.Surface((self.width, self.height))
        self.color = color
        self.frame_color = frame_color
        self.rect = self.surface.get_rect(topleft=self.pos)
        # Надпись
        self.text_color = text_color
        self.font = pygame.font.Font(None, self.height // 2)
        self.surface_text = self.font.render(self.name, 5, self.text_color)
        self.text_rect = self.surface_text.get_rect(center=(self.width // 2, self.height // 2))
 
    def set_name(self, name):
        self.name = name
 
    def set_pos(self, pos):
        self.pos = pos
 
    def set_size(self, width, height):
        self.width = width
        self.height = height
 
    def set_color(self, color=(150, 150, 150)):
        self.color = color
 
    def set_text_color(self, text_color=(0, 0, 0)):
        self.text_color = text_color
 
    def set_frame_color(self, frame_color=(150, 150, 150)):
        self.frame_color = frame_color
 
    def click(self):
        if self.rect.collidepoint(pygame.mouse.get_pos()):
            return True
        else:
            return False
 
    def blit(self, surface: pygame.Surface):
        #   Фон
        self.surface.fill(self.color)
        #   Текст
        self.surface.blit(self.surface_text, self.text_rect)
        #   Рамка
        width = self.width // 100 * 5
        frame = pygame.Rect(0, 0, self.width, self.height)
        pygame.draw.rect(self.surface, self.frame_color, frame, width)
        #   Вставка
        surface.blit(self.surface, self.rect)
 
 
class Bar_button():
    def __init__(self, number=2, pos=(0, 0), orientation='v'):
        self.buttons = []
        for n in range(number):
            self.buttons.append(Button)
            self.buttons[n].set_size(200, 100)
            self.buttons[n].set_name('кнопка ' + str(n))
            
    def blit(self, surface: pygame.Surface):
        Button.blit(surface)
Внимание вопрос! Как правильно написать строки 63, 64, 67? Сейчас PyCarm пишет, что пeрвым параметром ожидается self:Button
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2019, 08:28
Ответы с готовыми решениями:

Вызов статического метода одного класса из другого класса java
Доброго дня! Есть два класса Java, хранящиеся в разных директориях. Файл D:\java\second\TracePrint.java import java.io.*; ...

Вызов метода одного класса внутри другого класса
PHP передача метода, с класса, в другой класс Столкнулся с проблемой не могу передать метод или функцию с одного класса в другой ...

Вызов метода одного класса из другого
Добрый день столкнулся с проблемой. У меня есть два класса GameField и Rules. Класс Rules наследуется от GameField (т.к в нем есть список...

12
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
21.09.2019, 08:40
Лучший ответ Сообщение было отмечено miskam как решение

Решение

Цитата Сообщение от miskam Посмотреть сообщение
Внимание вопрос! Как правильно написать строки 63, 64, 67? Сейчас PyCarm пишет, что пeрвым параметром ожидается self:Button
внимание ответ: открываем главу в книге по ООП в пайтон и вдумчиво читаем, основные цели -понять что такое объект, его разницу с классом.
Цитата Сообщение от miskam Посмотреть сообщение
self.buttons.append(Button)
вот тут ты наверное хотел добавить не класс, а его объект, то есть
Python
1
self.buttons.append(Button())
Добавлено через 3 минуты
Цитата Сообщение от miskam Посмотреть сообщение
for n in range(number):
* * * * * * self.buttons.append(Button)
* * * * * * self.buttons[n].set_size(200, 100)
* * * * * * self.buttons[n].set_name('кнопка ' + str(n))
Python
1
2
for n in range(number):
            self.buttons.append(Button(width = 200, height = 100, name ='кнопка ' + str(n)))
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 08:46  [ТС]
Точно! Спасибо. Я добавлял объект и про возможность добавления класса я даже не задумывался. А нафига такое может понадобиться? Класс содержащий класс...
Кстати, Blit у меня там не правильно написан надо так:
Python
1
2
3
        
for button in self.buttons:
     button.blit(surface)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
21.09.2019, 08:49
Цитата Сообщение от miskam Посмотреть сообщение
и про возможность добавления класса я даже не задумывался.
Знаешь главный плюс пайтон? Его гибкость -можно сотней способов решать проблемы, о которых в других языках и не мечтают
А какой главный минус? Его гибкость - можно сотней способов выстрелить себе в ногу
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
21.09.2019, 10:04
Цитата Сообщение от miskam Посмотреть сообщение
А нафига такое может понадобиться? Класс содержащий класс...
Может никогда никому и не понадобится. Но В питоне заложен общий механизм, что метод a_list.append(obj) добавляет в список объект, не ограничивая, что это за объект. А класс в питоне, это тоже объект. Когда Вы пишете просто имя класса, Вы ссылаетесь на объект-класс. Когда же Вы пишете имя класса с круглыми скобками на конце, то создаете новый экземпляр класса.
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 10:05  [ТС]
Хотел поупражняться как раз таки в ООП. Кнопки, по-моему, подошли как нельзя лудьше
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
21.09.2019, 10:06
Цитата Сообщение от miskam Посмотреть сообщение
лудьше
1
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 12:38  [ТС]
закончил модуль с кнопками. В основном блоке программы импортировал файл модуля.
Python
1
2
3
4
5
6
7
8
import gamebutton
impport pygame
win = pygame.display.set_mode((1500, 900))
start_menu = gamebutton.Bar_button(number=4, orientation='v', pos=(1100, 0))
start_menu.set_all_names(('старт', 'установки', 'карты', 'выход'))
start = gamebutton.Button(name='START', pos=(200, 200))
start.blit(win)
start_menu.blit(win)
Запускаю и получаю ошибку:

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "D:/Документы/Максим/Python/snake.py", line 332, in <module>
start_menu.blit(win)
File "D:\Документы\Максим\Python\gamebutton.p y", line 78, in blit
self.buttons[n].blit(surface)
AttributeError: 'str' object has no attribute 'blit'

Process finished with exit code 1

Подскажите в чем ошибка

строка на которую указывает программа 3:
Python
1
2
3
    def blit(self, surface: pygame.Surface):
       for n in range(len(self.buttons)):
           self.buttons[n].blit(surface)
при этом если не импортировать файл, а запускать его непосредственно, то все работает. Так же все работает если вставлять объет Button (т.е. одиночную кнопку)
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,300
21.09.2019, 13:09
Цитата Сообщение от miskam Посмотреть сообщение
закончил модуль с кнопками.
Выложите этот модуль, а то не понятно, что вы там исправляли
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 13:14  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import pygame
 
pygame.init()
 
 
class Button:
    def __init__(self, name='кнопка', pos=(0, 0), width=100, height=50, color=(150, 150, 150), text_color=(0, 0, 0),
                 frame_color=(150, 150, 150)):
        self.name = name
        # Координаты
        self.pos = pos
        self.width = width
        self.height = height
        # Поверхность кнопки
        self.surface = pygame.Surface((self.width, self.height))
        self.color = color
        self.frame_color = frame_color
        self.rect = self.surface.get_rect(topleft=self.pos)
        # Надпись
        self.text_color = text_color
        self.font = pygame.font.Font(None, self.height // 2)
        self.surface_text = self.font.render(self.name, 5, self.text_color)
        self.text_rect = self.surface_text.get_rect(center=(self.width // 2, self.height // 2))
 
    def set_name(self, name):
        self.name = name
 
    def set_pos(self, pos):
        self.pos = pos
        self.rect.topleft = self.pos
 
    def set_size(self, width, height):
        self.width = width
        self.height = height
 
    def set_color(self, color=(150, 150, 150)):
        self.color = color
 
    def set_text_color(self, text_color=(0, 0, 0)):
        self.text_color = text_color
 
    def set_frame_color(self, frame_color=(150, 150, 150)):
        self.frame_color = frame_color
 
    def click(self):
        if self.rect.collidepoint(pygame.mouse.get_pos()):
            return True
        else:
            return False
 
    def blit(self, surface: pygame.Surface):
        #   Фон
        self.surface.fill(self.color)
        #   Текст
        self.surface.blit(self.surface_text, self.text_rect)
        #   Рамка
        width = self.width // 100 * 5
        frame = pygame.Rect(0, 0, self.width, self.height)
        pygame.draw.rect(self.surface, self.frame_color, frame, width)
        #   Вставка
        surface.blit(self.surface, self.rect)
 
 
class Bar_button:
    def __init__(self, number=4, pos=(0, 0), orientation='v'):
        self.pos = pos
        self.buttons = []
        self.focus = 0
        for n in range(number):
            self.buttons.append(Button(name='кнопка ' + str(n), width=200, height=100))
            if orientation == 'v':
                self.buttons[n].set_pos(
                    (self.pos[0], self.pos[1] + ((self.buttons[n].height + self.buttons[n].height // 3) * n)))
            elif orientation == 'h':
                self.buttons[n].set_pos(
                    (self.pos[0] + (self.buttons[n].width + self.buttons[n].width // 4) * n, self.pos[1]))
 
    def blit(self, surface: pygame.Surface):
        for n in range(len(self.buttons)):
            self.buttons[n].blit(surface)
 
    def set_all_names(self, names):
        for n in range(len(self.buttons)):
            self.buttons[n] = names[n]
 
 
""""
win = pygame.display.set_mode((800, 600))
start = Button('старт', (200, 100), 200, 100)
setting = Button('установки', (300, 0), 100, 50)
but = Button('О', (300, 200), 400, 200)
bar = Bar_button(number=4, orientation='v')
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP:
            if start.click():
                print('Старт')
            elif setting.click():
                print('Установки')
            elif but.click():
                print('QQQ')
                but.set_frame_color((200, 0, 0))
    bar.blit(win)
 #   start.blit(win)
 #   setting.blit(win)
 #   but.blit(win)
    pygame.display.update()"""
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
21.09.2019, 13:47
miskam, а тебе интерпретатор все написал -и что за ошибка и где она
Цитата Сообщение от miskam Посмотреть сообщение
start_menu.set_all_names(('старт', 'установки', 'карты', 'выход'))
идем, смотрим что там происходит в методе

Цитата Сообщение от miskam Посмотреть сообщение
def set_all_names(self, names):
* * * * for n in range(len(self.buttons)):
* * * * * * self.buttons[n] = names[n]
ты каждому элементу баттонс присваиваешь пришедший текст, то есть твои кнопки пропадают, остаются только строки ('старт', 'установки', 'карты', 'выход'), у которых конечно нет метода блит

я когда тебе написал
Цитата Сообщение от Welemir1 Посмотреть сообщение
открываем главу в книге по ООП в пайтон и вдумчиво читаем,
ты какие действия предпринял?
0
1 / 1 / 0
Регистрация: 04.08.2019
Сообщений: 33
21.09.2019, 13:56  [ТС]
Бляяяя!!!! Вот я затупил... не первый раз уже. А главу про ООП уже раза 3 перечитал, один раз даже вдумчиво
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
21.09.2019, 14:03
miskam, ок, не забывай читать до и после еды.
Кроме того, очень прошу тебя ознакомиться вот с этой темой, там для Идеи, но в пичарме все также, это спасет тебе тонны времени и убережет от лишних тем на форуме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2019, 14:03
Помогаю со студенческими работами здесь

Делегаты или вызов метода класса из другого класса
Добрый день! В попытке изучения c# наткнулся на такую проблему: 1. Зачем нужен делегат? Ведь я могу вызвать метод класса из другого...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void Method() Необходимо при нажатии на...

Вызов метода класса Form1 из другого класса
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Вызов метода класса методом другого класса
Есть 2 класса: UControl с классом TControl и UEditor с классом TEditor. Метод класса TControl должен вызвать метод класса TEditor. ...

PyQt5 вызов метода класса из другого класса
Я создаю свой текстовый редактор. Виджет дерева каталогов я отрисовываю с помощью класса: class TreeView(QTreeView): ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru