2017-02-26 56 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