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

2024-09-27 23:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python3程序,它的类的层次结构最终都是从一个基类“RootClass”派生的。我希望能够从任何类的对象中设置一个值,并从这些类的任何其他对象中查看该值。我目前的解决方案是使用一个全局变量,该变量由“RootClass”中定义的对象方法访问。你知道吗

文件1.py:

_myVal= None  # the global variable

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

文件2.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

我意识到globals通常是不受欢迎的,但我认为没有什么比它更干净和简单的了。你知道吗

我考虑的另一个选项是创建一个具有set/get方法的“ValClass”对象。然后RootClass中的set/get方法将调用该对象的set/get方法。但这意味着我仍然必须创建ValClass对象,并确保它可以从所有其他对象访问,所以我基本上回到了全局。你知道吗

解决这个问题的更好的/更像Python的方法是什么?你知道吗


Tags: 文件对象方法pygetdefpassglobal
2条回答

如果希望它看起来更像python,可以使用属性:

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)

只需将作用域设置为类的\u 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())

相关问题 更多 >

    热门问题