Python访问所有派生类的基类数据

时间:2017-02-26 21:23:38

标签: python python-3.x

我有一个带有类层次结构的Python 3程序,这些类最终都是从一个基类“RootClass”派生而来的。我希望能够从任何类的对象设置一个值,并从这些类的任何其他对象中查看该值。我现有的解决方案使用了一个全局变量,该变量可以通过'RootClass'中定义的对象方法访问。

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解决这个问题的方法?

2 个答案:

答案 0 :(得分: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())

答案 1 :(得分:1)

如果您希望它看起来更加pythonic,您可以使用属性:

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)