2016-12-28 2 views
0

Я недавно решил начать изучение python. В течение большей части моего времени я использовал C++, и некоторые вещи меня очень сбивают с толку.Правильный способ мутации инициализированных объектов в python

Вот мой код, который у меня есть проблема с (полный код здесь: http://pastebin.com/tj3qJnvM)

class Display: 

    def __init__(self, background): 
     resolution = (800, 600)  
     screen = pygame.display.set_mode(resolution) 
     background = pygame.Surface(screen.get_size()) 
     background.fill((255, 255, 255)) 
     background = background.convert() 

def init(map, background): 
    pygame.init() 
    display = Display(background) 
    map.draw(background) 

def main(): 
    background = None 
    init(map, background) 

Когда я называю display = Display(background) в init (строка 61), он должен инициализировать фон, поэтому он может быть использован на следующей линия. Вместо этого я получаю сообщение об ошибке «Нет».

Если я правильно понял это из-за того, что фон был установлен на None, а None не изменен, поэтому он создает локальный фон переменной в конструкторе Display.

Как подойти к этой ситуации?

Я знаю, что было бы лучше сделать фон членом класса Display, но я хочу понять, как создать нечто похожее на объявление указателя/ссылки в C. И затем инициализировать его в некоторой функции. Было бы полезно передать его затем некоторым функциям.

Возможно ли это в python или это обходное решение необходимо каждый раз?

+1

Пожалуйста, положите [mcve] в вопрос. Также вы не используете 'self.', поскольку я предполагаю, что это атрибуты экземпляра; прочитайте учебник. – jonrsharpe

+0

Извините, теперь пример должен быть более читаемым. Я хочу инициализировать фон из основного внутри другой функции, поэтому я не хочу использовать self в этом случае. – Thun

+0

Возможно, вы прочитали [раздел 9, Классы] (https://docs.python.org/3/tutorial/classes.html) учебника. Похоже, вам нужно потратить немного времени на изучение того, как делать вещи на Python. , '' 'display''' является экземпляром' '' Display''', и к его атрибутам обращается '' 'display.attribute'''. - Но так, как вы написали свой класс, нет никаких атрибутов экземпляра. Вероятно, вы также должны прочитать [имя и привязку] (https://docs.python.org/3/references/executionmodel.html#naming-and-binding). – wwii

ответ

0

Исправлено. Я думаю, что вы ищете сохраненное состояние в переменных экземпляра класса. Используйте self., если вы хотите сохранить материал в классе. Как и большинство языков, переменные, если они не определены как глобальные, не будут влиять ни на что иное. Я добавил self. и удалил параметр функции фоновой переменной.

class Display: 

    def __init__(self): 
     resolution = (800, 600)  
     screen = pygame.display.set_mode(resolution) 
     background = pygame.Surface(screen.get_size()) 
     background.fill((255, 255, 255)) 
     self.background = background.convert() 

def init(map): 
    pygame.init() 
    display = Display() 
    map.draw(display.background) 

def main(): 
    init(map) 

Кроме того, вы не определили map, так что вы будете иметь проблемы с map.draw. Он работает только потому, что map просто является встроенной функцией Python.

EDIT: nevermind, забудьте, что я только что сказал ^.

Я вижу, что ваш полный образец кода определяет его.

+0

По этой причине я бы посоветовал использовать «карту» в качестве имени параметра, но технически он не должен вызывать никаких проблем в этом очень ограниченном случае (поскольку он существует только в пределах функции вызова функции) –

+0

Да, это именно то, что я и это работает хорошо. Это гораздо лучший подход для размещения фона внутри класса. Благодаря! Редактировать: вы забыли поставить себя.перед другим «фоном» :) – Thun

+0

Нет, другая переменная 'background' является только локальной переменной и не имеет перед собой' self.'. Он устанавливается только после того, как он возвращается из '.convert()'. Создание поля класса избыточно, поскольку оно будет просто перезаписано 'self.background = [self.] Background.convert()' в любом случае. –

Смежные вопросы