3

我有以下代码块。

class Starter():
    def __init__(self, reference):
        self.reference = reference

    def change_ref(self):
        print("Got :", self.reference)
        self.reference = 1
        print("Now :", self.reference)

class Stopper():
    def __init__(self, reference):
        self.reference = reference

    def change_ref(self):
        print("Got :", self.reference)
        self.reference = 2
        print("Now :", self.reference)


class Controller():

    def __init__(self):
        self.main_reference = 0
        self.starter = Starter(self.main_reference)
        self.stopper = Stopper(self.main_reference)

controller = Controller()
controller.starter.change_ref()
controller.stopper.change_ref()

它输出以下内容:

Got : 0
Now : 1
Got : 0
Now : 2

我希望启动器和停止器类修改并达到相同的对象。所以我正在寻找的输出如下:

Got : 0
Now : 1
Got : 1
Now : 2

使用三个不同的类来做到这一点的最佳方法是什么?我很好奇我们是否可以利用类,而不是使用数组。如果可能的话,我也可以使用嵌套类。我唯一的限制是StarterStopper必须彼此分开,因为在我的项目中我将它们用作QThread子类。这导致他们以不同的方式覆盖他们的运行方法。

4

2 回答 2

4

不确定这是最优雅的方法,但使用列表作为参考来完成这项工作:

class Starter():
    def __init__(self, reference):
        self.reference = reference

    def change_ref(self):
        print("Got :", self.reference[0])
        self.reference[0] = 1
        print("Now :", self.reference[0])

class Stopper():
    def __init__(self, reference):
        self.reference = reference

    def change_ref(self):
        print("Got :", self.reference[0])
        self.reference[0] = 2
        print("Now :", self.reference[0])


class Controller():

    def __init__(self):
        self.main_reference = [0]
        self.starter = Starter(self.main_reference)
        self.stopper = Stopper(self.main_reference)

controller = Controller()
controller.starter.change_ref()
controller.stopper.change_ref()
于 2019-10-23T14:39:14.930 回答
3

您的示例不起作用,因为当您实例化StarterStopper类时,您向它们传递了一个整数,并且它是按值传递的。

为了使这个工作,一个选项是将controller对象本身传递给StarterStopper构造函数,以便他们可以访问和修改它main_reference

class Starter():
    def __init__(self, controller):
        self.controller = controller

    def change_ref(self):
        print("Got :", self.controller.main_reference)
        self.controller.main_reference = 1
        print("Now :", self.controller.main_reference)

class Stopper():
    def __init__(self, controller):
        self.controller = controller

    def change_ref(self):
        print("Got :", self.controller.main_reference)
        self.controller.main_reference = 2
        print("Now :", self.controller.main_reference)


class Controller():

    def __init__(self):
        self.main_reference = 0
        self.starter = Starter(self)
        self.stopper = Stopper(self)

controller = Controller()
controller.starter.change_ref()
controller.stopper.change_ref()
于 2019-10-23T14:41:53.370 回答