2017-02-26 176 views
2

我有一個Python 3程序,它具有最終從單個基類「RootClass」派生的類層次結構。我希望能夠從任何類的對象中設置值,並從這些類的任何其他對象中查看該值。我目前使用的解決方案使用全局變量,該變量可以通過'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:

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()) 

執行:

CMD> python file2.py 
100 
100 
100 
100 

我認識的全局變量在一般皺着眉頭,但沒有別的,我認爲看起來很乾淨簡單。

我考慮的另一個選擇是製作一個具有set/get方法的'ValClass'對象。然後,RootClass中的set/get方法將調用該對象的set/get方法。但這意味着我必須仍然創建ValClass對象,並確保它可以從其他所有對象訪問,所以我基本上回到了擁有全局的對象。

什麼是解決這個問題的更好/更多Pythonic方法?

回答

1

只需要如果你想讓它更Python,你可以使用屬性來設置範圍類的範圍爲_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