class Draw():
'''Class using, for example opengl, to display something on the screen'''
def add(self,size,file_name):
file_name= file_name
size = size
class Image(Draw):
def __init__(self,size,file_name):
self.size = size
self.add(self.size,file_name)
class Gui():
file_names = ['a.jpg','b.jpg']
images = {}
def __init__(self):
for e in self.file_names:
self.image = Image((50,50),file_name=e)
self.images[e] = self.image
def print_size(self):
print(self.image.size)
a = Gui()
a.print_size() #this gives me a proper (50,50) size
for e in a.images.values():
print(e.size) #this gives me wrong size
Это упрощенная версия моего кода. У меня нет опыта хранения объектов в словарных значениях. Мой вопрос: это нормально, что я не получаю доступ к нужным атрибутам сохраненных объектов в словаре? В этом примере все работает нормально, но это неправильный способ написания кода?






Я запускаю ваш код, и он работает как надо. В терминале было напечатано
(50, 50)
(50, 50)
(50, 50)
Вы ожидали чего-то другого? Теперь я попытаюсь объяснить несколько вещей.
class Draw():
'''Class using, for example opengl, to display something on the screen'''
Я не могу полностью понять, как это должно работать, но если вы хотите сохранить размер и имя_файла в методе добавления, вы должны использовать self. перед переменными, поэтому это будет выглядеть как
def add(self,size,file_name):
self.file_name = file_name
self.size = size
class Image(Draw):
def __init__(self,size,file_name):
self.size = size
self.add(self.size,file_name)
class Gui():
file_names = ['a.jpg','b.jpg']
images = {}
def __init__(self):
Теперь на каждой итерации вы создаете новое изображение с тем же размером (50, 50), но с другим именем и привязкой к карте.
for e in self.file_names:
self.image = Image((50,50),file_name=e)
self.images[e] = self.image
В цикле вышеупомянутого метода инициализации для self.image вы используете последнее созданное вами изображение на основе имен файлов ('b.jpg'), поэтому self.image и self.images ['b.jpg'] указывают на один и тот же объект.
Метод print_size печатает размер self.image / self.images ['b.jpg'], который равен (50, 50)
def print_size(self):
print(self.image.size)
a = Gui()
a.print_size() #this gives me a proper (50,50) size
Теперь вы повторяете свои изображения. Их два: один с именем_файла 'a.jpg' и второй, который уже был напечатан до 'b.jpg'. Оба они имеют одинаковый размер (50, 50).
for e in a.images.values():
print(e.size) #this gives me wrong size
Надеюсь, я немного прояснил, и это поможет вам
Спасибо за ваш вклад. Класс Draw () абстрактный, верно, я должен использовать в нем собственный экземпляр. Я заменяю класс Kivy Widget () и его родителей на мой класс Draw (): просто чтобы код выглядел проще. Мне было интересно, все ли я сделал правильно, иначе в коде, который я опубликовал здесь.
Вы не сказали, какой результат ожидали. Кроме того, вы можете создать экземпляр класса Draw, чтобы он не был абстрактным. Если вы хотите создать абстрактный класс в Python, проверьте модуль abc
Это не проблема, но ваш метод
addабсолютно ничего не делает.