首页 > 解决方案 > 被继承的类能看到父类上值的变化吗?

问题描述

我有两节课。A 类有一个公共变量X,两个类都使用它, A 类每 3 秒更改一次X的值,而B 类打印X的新值。但是B 类只看到初始值10。我需要class B来查看Class A中变量X的变化。

import threading
import time
class A():
    X = 10
    def __init__(self):
       self.first() 
    def first(self):
      while True:
        self.X = self.X + 3
        print("A",self.X)
        time.sleep(3)
    
class B(A):
   def __init__(self):
        t = threading.Thread(target= self.second, args=())
        t.setDaemon(True)
        t.start() 
   def second(self):
        while True:
            print(self.X)
            time.sleep(3)
example1 = B()
example2 = A()

标签: pythonpython-3.xinheritance

解决方案


这不是设置类变量X

self.X = self.X + 3

在第一次迭代self.X中读取类变量,因为没有实例变量X

但是,它分配实例变量,从那时起,self.XinnerA是一个实例变量,所做的任何更改都不会反映在A.X.

您可以通过使方法 ( ) 的第一个参数引用类而不是带有装饰器self的实例来解决此问题。@classmethod

    @classmethod
    def first(cls):
        while True:
            cls.X = cls.X + 3
            print("A",cls.X)
            time.sleep(3)

完整代码:

import threading
import time
class A():
    X = 10
    def __init__(self):
        self.first()
        
    @classmethod
    def first(cls):
        while True:
            cls.X = cls.X + 3
            print("A",cls.X)
            time.sleep(3)
    
class B(A):
    def __init__(self):
        t = threading.Thread(target= self.second, args=())
        t.setDaemon(True)
        t.start() 
    
    def second(self):
        while True:
            print(self.X)
            time.sleep(3)
example1 = B()
example2 = A()

推荐阅读