如何间接访问 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)
如果我有一个定义了某些属性的 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)