我有一个带有类层次结构的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解决这个问题的方法?
答案 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)