Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setattr不';使用字符串时,请不要更新类的正确属性_Python_String_Setattr - Fatal编程技术网

Python setattr不';使用字符串时,请不要更新类的正确属性

Python setattr不';使用字符串时,请不要更新类的正确属性,python,string,setattr,Python,String,Setattr,我试图用setattr和字符串更新类的属性。例如,对于这个代码: 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)时

我试图用
setattr
和字符串更新类的属性。例如,对于这个代码:

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
类的属性
A
。相反,它会创建另一个属性,如图所示:

在名为
CA.A

然后当我打印
print(CB.CA.A)
时,我得到一个0值。 我不明白为什么会发生这种情况,以及是否存在解决方案?

setattr()
采用文字属性名称。它不支持嵌套属性;名称中的
只是名称中的一个点,而不是属性分隔符

换句话说,
CB.CA.A=2
中的
是访问属性的语法,而不是属性名称的一部分<首先查找code>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()
采用文字属性名称。它不支持嵌套属性;名称中的
只是名称中的一个点,而不是属性分隔符

换句话说,
CB.CA.A=2
中的
是访问属性的语法,而不是属性名称的一部分<首先查找code>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)

哦,我明白了。我喜欢inception函数:),但是如果我试图创建一个名称中带有点的变量,它会给我一个错误。那么为什么我使用
setattr
时会创建一个带有点的属性呢name@ymmx:通常,语法限制您使用有效的Python标识符(不能包含点)。那是因为点有特殊的意义。但是
setattr()
getattr()
不限于这样的名称,您可以使用任何字符串。这与支持dots@Mr_and_Mrs_D
operator.attrgetter()
是这里的特例。我明白了。我喜欢inception函数:),但是如果我试图创建一个名称中带有点的变量,它会给我一个错误。那么为什么我使用
setattr
时会创建一个带有点的属性呢name@ymmx:通常,语法限制您使用有效的Python标识符(不能包含点)。那是因为点有特殊的意义。但是
setattr()
getattr()
不限于这样的名称,您可以使用任何字符串。这与支持dots@Mr_and_Mrs_D
operator.attrgetter()
是这里的特例。