如何间接访问 class 实例属性?

How to access class instance attributes indirectly?

如果我有一个定义了某些属性的 class 实例,我该如何间接访问它们?我的第一个想法是将它们放入字典中,然后使用关键字访问它们,但这并不像我预期的那样有效 - 下面的示例:

class Test:
    def __init__(self):
        self.testval=0
    
test=Test()
testfuncs={'A':test.testval}

print(test.testval)
testfuncs['A']=1
print(test.testval)

这会打印“0”,然后打印“0”,因为我没有修改 class 变量,我只是将字典值更改为整数“1”。

所以我希望能够访问和修改属性testval。这样做的原因是在一个更大的程序中有一些定义的 class 实例变量,我想分配一次然后在整个过程中重用。然后只需更新 dict 它们就会随处发生变化(它们是电压通道,可能会随着应用程序的变化而变化)。

你可以设置字典的值作为你的测试对象

class Test:
    def __init__(self):
        self.testval = 0


test = Test()
testfuncs = {'A': test}

print(test.testval) # prints 0
testfuncs['A'].testval = 1
print(test.testval) # prints 1

如果变量中有对象的名称,请使用 getattr() 函数获取对象的属性,并在类似情况下使用 setattr() 设置它。

class Test:
    def __init__(self):
        self.testval = 0

test=Test()
A = "testval"

print(test.testval)
setattr(test, A, 1)
print(test.testval)

您还可以定义您的 class 以具有 __setitem__ 方法;然后你可以使用 dictionary-like 语法来设置属性。

class Test:

    def __init__(self):
        self.testval = 0

   def __setitem__(self, key, value):
        setattr(self, key, value)

test=Test()
A = "testval"

print(test.testval)
test[A] = 1
print(test.testval)

最后(好吧,还有其他方法可以处理这个问题,但我只会再提一个)......最后,你可以创建一个 class 来保存对对象的引用和一个属性名称。当您想传递此类引用时,这很方便。

class Test:
    def __init__(self):
        self.testval = 0

class IndirectAttribute:

    def __init__(self, obj, attr):
        self.obj = obj
        self.attr = attr

    def set(self, value):
        setattr(self.obj, self.attr, value)

test = Test()
A = IndirectAttribute(test, "testval")

print(test.testval)
A.set(1)
print(test.testval)