2017-02-26 3 views
2

私は最終的に単一の基本クラス 'RootClass'から派生したクラスの階層を持つPython 3プログラムを持っています。いずれかのクラスのオブジェクトから値を設定し、それらのクラスの他のオブジェクトからその値を参照できるようにします。私の現在のソリューションは、動作しますが、 'RootClass'で定義されたオブジェクトメソッドによってアクセスされるグローバル変数を使用します。すべての派生クラスのPythonアクセスベースクラスデータ

file1.py:

_myVal= None # the global variable 

class RootClass: 
    def setVal(self, y): 
     global _myVal 
     _myVal= y 
    def getVal(self): 
     return _myVal 

file2.py:私はグローバルは、一般的に眉をひそめている実感

CMD> python file2.py 
100 
100 
100 
100 

、それ以外は何も私は考えられませんしました:

from file1 import RootClass 

class A (RootClass): 
    pass 
class B (A): 
    pass 
class C (B): 
    pass 
class D (RootClass): 
    pass 

if __name__ == "__main__": 
    objA = A() 
    objB = B() 
    objC = C() 
    objD = D() 
    objD.setVal(100) 
    print(objA.getVal()) 
    print(objB.getVal()) 
    print(objC.getVal()) 
    print(objD.getVal()) 

実行きれいでシンプルなようです。

私が考えた別のオプションは、メソッドを設定/取得する 'ValClass'オブジェクトを作ることです。次に、RootClassのset/getメソッドは、そのオブジェクトのset/getメソッドを呼び出します。しかし、それは私がまだValClassオブジェクトを作成し、それが他のすべてのオブジェクトからアクセス可能であることを確認しなければならないことを意味します。したがって、私は基本的にグローバルを持つことに戻ります。

これを解決するにはより良い/もっとPythonicな方法はありますか?

答えて

1

ちょうどあなたはそれがより多くのニシキヘビを見たい場合は、プロパティを使用することができます_myVal

class RootClass: 
    def setVal(self, y): 
     RootClass._myVal= y #Changed _myVal to be in RootClass's scope 
    def getVal(self): 
     return RootClass._myVal 


class A (RootClass): 
    pass 
class B (A): 
    pass 
class C (B): 
    pass 
class D (RootClass): 
    pass 

if __name__ == "__main__": 
    objA = A() 
    objB = B() 
    objC = C() 
    objD = D() 
    objD.setVal(100) 
    print(objA.getVal()) 
    print(objB.getVal()) 
    print(objC.getVal()) 
    print(objD.getVal()) 
+0

まあ、それは同じように簡単です私の解決策として、そしてグローバルを避けています。私はそれを考えなかったのは恥ずかしいです。ありがとうございました! – Craig

1

のクラスのスコープにスコープを設定する必要があります。

class RootClass: 
    @property 
    def val(self): 
     return RootClass._myVal 
    @val.setter 
    def val(self, y): 
     RootClass._myVal= y 

class A (RootClass): 
    pass 
class B (A): 
    pass 
class C (B): 
    pass 
class D (RootClass): 
    pass 

if __name__ == "__main__": 
    objA = A() 
    objB = B() 
    objC = C() 
    objD = D() 
    objD.val = 100 
    print(objA.val) 
    print(objB.val) 
    print(objC.val) 
    print(objD.val) 
+0

私はあなたのコードを理解するためにどのようにプロパティが動作するか調べました。今では、他の状況でプロパティがどのように役立つのかを見ることができます。ありがとう! – Craig