从另一个类更改实例变量

时间:2018-07-17 21:35:17

标签: python class

我正在尝试从另一个类中更改以下代码中的self.var_1,但收到错误test1 has no attribute 'var_1'。我觉得我犯了一个简单的错误,但似乎找不到问题。

class test1:
    def __init__(self):
        self.var_1 = "bob"
        instance2 = test2()

    def change_var(self, new_var):
        print(self.var_1) #should print "bob"
        self.var_1 = new_var #should change "bob" to "john"
        print(self.var_1) #should print "john"

class test2:
    def __init__(self):
        test1.change_var(test1, "john")

instance = test1()

2 个答案:

答案 0 :(得分:3)

var_1是一个实例变量,因此您需要使用该实例:

class test1:
    def __init__(self):
        self.var_1 = "bob"
        instance2 = test2(self)    # <<<<<< pass test1 instance

    def change_var(self, new_var):
        print(self.var_1) #should print "bob"
        self.var_1 = new_var #should change "bob" to "john"
        print(self.var_1) #should print "john"

class test2:
    def __init__(self, t1obj):      # <<<< take test1 instance
        t1obj.change_var("john")    # <<<< use test1 instance

instance = test1()

礼物:

bob
john

答案 1 :(得分:1)

根据您的评论,我觉得您正在为课程创建singleton pattern

有多种方法可以完成此操作,大多数方法可以在above SO question中找到。

我创建了一个装饰器,并将其应用于您的班级,从而使用了答案中概述的第一种方法。

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class Test1(object):
    def __init__(self):
        self.var_1 = "bob"

    def change_var(self, new_var):
        print(self.var_1) #should print "bob"
        self.var_1 = new_var #should change "bob" to "john"
        print(self.var_1) #should print "john"

class Test2(object):
    def __init__(self):
        test1 = Test1()
        test1.change_var("john")

Test2()

您可以在repl.it上查看此结果,并查看结果与您的输出相匹配。

  

鲍勃

     

约翰