2017-10-23 7 views
-1

は、質問のためのいくつかのサンプルコードです:これを実行すると、コンストラクタは一度だけ呼び出されるため クラス内のインスタンス変数をクラス外から更新するにはどうすればよいですか?ここで

class Obj():  
    def __init__(self, p): 
     self.property = p 

    def printProp(self): 
     print(self.property) 

myVar = 0 
myObject = Obj(myVar) 

myObject.printProp() 
myVar = 1 
myObject.printProp() 

、パラメータが変更されず、0が二回印刷されます。プロパティに常にmyVar変数を直接参照させる方法はありますか?

+1

"プロパティに常にmyVar変数を直接参照させる方法はありますか?" - いいえ。変数はそのようには機能しません。 'myObject.property'は変数ではなく、オブジェクトを参照するだけです。 – user2357112

+0

@ user2357112、よく、微妙な違いがあります:変更可能な型(辞書、タプル、リストなど)の変数で、再定義されずに代わりに変更された場合、上記のコードはうまくいくでしょう –

答えて

-1

myObject.property = 1のように直接classesプロパティにアクセスできます。 はまた、あなたはこのようにプロパティを設定するには、クラスメソッドを追加することができます。これは、クラスのプロパティとして、一般的に、より良いコーディング練習が唯一のクラス内で変更する必要がありますされ

def setProp(self, val): 
    self.property = val 

+0

Umm ... Python best実際にはこのような不要なゲッタ/セッタ関数を避ける*ことです。属性に接頭辞が付いていない場合は、通常は公開APIの一部とみなされます。クラスの期待される型と内容に従う限り、それを読んだり、書き込んだりしても構いません。 '@ property'デコレータが存在するので、public属性をgetter/setterのシームレスな使い方に変更することができます。単純な属性ではなく、getとsetのロジックが必要です。 – ShadowRanger

+0

[Per PEP8](https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance): "単純なパブリックデータ属性の場合、属性名だけを公開することをお勧めします。複雑なアクセッサ/ミューテータのメソッドを使用しています。単純なデータ属性のアクセス構文では、機能の実装を隠すためにプロパティを使用します。 " – ShadowRanger

+0

十分です。クラス関数の外にあるC++設定クラスの属性から来ると、常に私は緊張します。ゲッター/設定がちょうど取得または設定である場合、それは不必要であることに同意します。私は通常、値が有効であることを保証するためにセッターを好みます。 –

関連する問題