2016-12-28 3 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) 

私は(ライン61)initdisplay = Display(background)を呼び出すと、それは次回に使用することができますので、それがバックグラウンドを初期化する必要がありますライン。代わりに、私はバックグラウンドがNoneであるというエラーが出ます。

私が正しく理解しているのは、バックグラウンドがNoneに設定されていて、Noneが変更できないために、Displayコンストラクタにローカル変数の背景が作成されるためです。

この状況にはどのようにアプローチすればよいですか?

背景をDisplayクラスのメンバにするのが最善であると知っていますが、Cでポインタ/参照を宣言するのと同様のものを作成する方法を理解したいと思います。 これは、それをいくつかの関数に渡すと便利です。

Pythonでも可能ですか、毎回回避策が必要ですか?

+1

質問に[mcve]を入れてください。また、私はインスタンス属性であると仮定しているため、 'self.'を使用していません。チュートリアルを読んでください。 – jonrsharpe

+0

申し訳ありませんが、例文は読みやすくする必要があります。私は他の関数の中でメインからバックグラウンドを初期化したいので、この場合は自己を使いたくありません。 – 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関数であるために実行されます。

編集:気にしない、私がちょうど言ったことを忘れてください。

完全なコードサンプルで定義されています。

+0

そのため、私はパラメータ名として "map"を使用することをお勧めしますが、技術的にはこの非常に限定されたケースでは何の問題も起こらないはずです(関数呼び出しのスコープ内にのみ存在するため) –

+0

それはうまく働いています。バックグラウンドをクラス内に配置する方がはるかに良いアプローチです。ありがとう! 編集:あなたは自己を置くのを忘れました。他の "背景"の前に) – Thun

+0

いいえ、他の 'background'変数はローカル変数にすぎず、その前に' self.'がありません。 '.convert()'から返された後にのみ設定されます。とにかく、 'self.background = [self。] background.convert()'によって上書きされるので、クラスフィールドを冗長にすることは冗長です。 –

関連する問題