如何从继承类更改主类的变量?

2024-10-04 11:27:47 发布

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

我需要直接从继承的类更改对象变量。 下面是我的代码示例:

class A(object):
    def __init__(self,initVal=0):
        self.myVal = initVal

    def worker(self):
        self.incrementor = B()
        self.incrementor.incMyVal(5)        

class B(A):
    def incMyVal(self,incVal):
        super().myVal += incVal

obj = A(5)
print(obj.myVal)

obj.worker()
print(obj.myVal)

但它不起作用:

^{pr2}$

我还尝试在B类中对变量使用全局/非局部关键字,但没有成功。在

在我的主要例子中,B类是一个事件处理程序。当事件发生时,它应该改变对象的属性。所以我不能在incMyVal方法中使用return。在


Tags: 对象代码selfobj示例def事件class
1条回答
网友
1楼 · 发布于 2024-10-04 11:27:47

super()只能在类MRO中搜索类属性,而不能搜索实例属性。myVal是在类的实例上设置的,而不是在类本身上设置的。在

只有一个实例;不管来自类A或派生类的代码正在更改实例上的属性,它只是一个命名空间。在

但是,在您的情况下,您甚至不应该使用继承。您试图使用一个独立的第二个实例来改变A实例的属性。类继承不允许您访问基类的实例。在

重构B以获取A的实例,然后对该实例执行操作:

class B:
    def __init__(self, ainstance):
        self.ainstance = ainstance
    def incMyVal(self, incVal):
        self.ainstance.myVal += incVal

注意,B在这里不是A的子类;它根本不是同一类型的(专门化的)对象;它是一种不同类型的东西,它可以增加另一个对象的属性。在

创建B的实例时传入实例:

^{pr2}$

这确实创建了一个循环引用,它可以使对象存活的时间比需要的时间长。您可能需要使用weak reference代替:

import weakref

class B:
    def __init__(self, ainstance):
        self.ainstance_ref = weakref.ref(ainstance)
    def incMyVal(self, incVal):
        ainstance = self.ainstance_ref()
        if ainstance is not None:
            ainstance.myVal += incVal

现在,B实例只保存对其A实例的弱引用,如果该实例不再存在,则不会执行任何操作。在

相关问题 更多 >