使用字符串时,setattr 不会更新 class 的正确属性
setattr doesn't update the correct attribute of a class when using string
我正在尝试用 setattr
和字符串更新 class 的属性。因此,例如使用此代码:
class ClassA():
def __init__(self):
self.A = 0
class ClassB():
def __init__(self):
self.CA = ClassA()
CB = ClassB()
setattr(CB, "CA.A", 2)
print(CB.CA.A)
当我执行 setattr(CB, "CA.A", 2)
时,它不会更新 CB
中 CA
class 的属性 A
。相反,它创建了另一个属性,如图所示:
中的 class CB
名为 CA.A
然后当我打印 print(CB.CA.A)
时,我得到一个 0 值。
我不明白为什么会这样,是否存在解决方案?
setattr()
采用 文字属性名称 。不支持嵌套属性;名称中的 .
是 名称中的一个点 ,而不是属性分隔符。
换句话说,CB.CA.A = 2
中的 .
是 访问属性的语法 ,而不是属性名称的一部分。 CB.CA
首先被查找,然后赋值给结果的 A
属性。
您需要在 .
上拆分并使用单独的 getattr()
调用首先获取父对象:
setattr(getattr(CB, 'CA'), "A", 2)
您可以将该逻辑包装到一个函数中:
def setattr_nested(base, path, value):
"""Accept a dotted path to a nested attribute to set."""
path, _, target = path.rpartition('.')
for attrname in path.split('.'):
base = getattr(base, attrname)
setattr(base, target, value)
我正在尝试用 setattr
和字符串更新 class 的属性。因此,例如使用此代码:
class ClassA():
def __init__(self):
self.A = 0
class ClassB():
def __init__(self):
self.CA = ClassA()
CB = ClassB()
setattr(CB, "CA.A", 2)
print(CB.CA.A)
当我执行 setattr(CB, "CA.A", 2)
时,它不会更新 CB
中 CA
class 的属性 A
。相反,它创建了另一个属性,如图所示:
CB
名为 CA.A
然后当我打印 print(CB.CA.A)
时,我得到一个 0 值。
我不明白为什么会这样,是否存在解决方案?
setattr()
采用 文字属性名称 。不支持嵌套属性;名称中的 .
是 名称中的一个点 ,而不是属性分隔符。
换句话说,CB.CA.A = 2
中的 .
是 访问属性的语法 ,而不是属性名称的一部分。 CB.CA
首先被查找,然后赋值给结果的 A
属性。
您需要在 .
上拆分并使用单独的 getattr()
调用首先获取父对象:
setattr(getattr(CB, 'CA'), "A", 2)
您可以将该逻辑包装到一个函数中:
def setattr_nested(base, path, value):
"""Accept a dotted path to a nested attribute to set."""
path, _, target = path.rpartition('.')
for attrname in path.split('.'):
base = getattr(base, attrname)
setattr(base, target, value)