繁体   English   中英

如何从另一个类访问更改的变量

[英]How can I access the changed variable from another class

我想在 A 类更改 self.tt 时在 B().check() 中打印(读取或使用)不断变化的变量 self.tt,是否有任何方法可以做到这一点或其他更好的解决方案来完成任务?

class A:
    def __init__(self):
        self.tt = 0

    def change_tt(self):
        for i in range(100000000):
            self.tt += 1
            sleep(1)


class B():
    def __init__(self):
        self.x = A.tt

    def check(self):
        while True:
            print(self.x)


a = A()
b = B()

x1 = threading.Thread(target=A.change_tt)
x2 = threading.Thread(target=B.check)

x1.start()
x2.start()
AttributeError: type object 'A' has no attribute 'tt'

这里发生了几件事。 最大的问题是您无法从类中访问实例属性。 第二个问题是整数是不可变的。

这是一些应该解决这两个问题的代码:

class A:
    def __init__(self):
        self.tt = 0

    def change_tt(self):
        for i in range(100000000):
            self.tt += 1
            sleep(1)


class B():
    def __init__(self, a):
        self.a = a

    def check(self):
        while True:
            print(self.a.tt)


a = A()
b = B(a)

x1 = threading.Thread(target=a.change_tt)
x2 = threading.Thread(target=b.check)

x1.start()
x2.start()

请注意, A类的代码保持不变。 但是,重要的是要了解它的使用方式不同。 A是类对象。 它的属性是函数,但没有整数。 当您创建实例a时,当您使用. 操作员。 a也有一个属性tt

线程目标应该是无参数可调用的。 函数A.change_ttB.check都需要一个位置参数self 但是,绑定方法a.change_ttb.check是无参数可调用对象。 将函数绑定到实例的过程. 运算符创建一个自动传入self的包装器。

当您执行self.tt += 1时,作为tt先前值的对象与tt未绑定,并且可能会被垃圾收集。 整数是不可变的,这意味着这里真正发生的是self.tt = self.tt + 1 这意味着即使tt存在于A中, B.__init__中的语句self.x = A.tt也是不合理的。 x将是对作为tt初始值的对象的引用,并且即使tt更改为递增版本,也会继续引用该对象。

B的一个实例需要知道A.tt当前引用的对象。 一种方法是传递对B.__init__的引用。 这就是我们定义__init__(self, a)并将B调用为B(a)以获取引用a的实例的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM