gpt4 book ai didi

python - 附加到列表时未调用 Setattr 方法

转载 作者:行者123 更新时间:2023-12-04 09:31:21 26 4
gpt4 key购买 nike

为什么在附加或连接对象属性的列表或字典时未调用 __setattr__ 方法。方法描述“在尝试属性分配时调用。”会让我相信连接两个列表是可行的,但是 __setattr__ 方法仍然没有被调用。

class objVal(object):
def __init__(self):
self.articles = {'testkeyword': [1,2,3], 'testkeyword1': [4,5,6]}
def __setattr__(self, key, value):
super(objVal, self).__setattr__(key, value)
print('setattr: ' + str(key) + '=' + str(value))

test = objVal()

templist = [11,12,13]
keyword = 'testkeyword'

test.articles[keyword] = test.articles[keyword] + templist # Does not trigger setattr
for item in templist:
test.articles[keyword].append(item) # Does not trigger setattr

print(test.articles[keyword])

最佳答案

__setattr__() 在使用以下语法时被调用:

obj.key = value
# obj.__setattr__('key', value)

请注意,调用方法(例如调用 .append())不会激活它,因为您没有直接为其设置任何内容。 (尽管检索 append 方法会触发 __getattr__())。

在大多数情况下,如果你设计了一个类,你最终会在某个时候调用 __setattr__() - 但对于大多数内置类,功能被抽象掉了,通过宏或其他“跳过”__setattr__() 步骤的方式处理。


请注意,__setitem__() 方法也存在于某些对象(不是全部!)上,并且与 __setattr__() 不同,因为它由不同的语法调用:

obj[key] = value
# obj.__setitem__('key', value)

但是,据我所知,在列表上调用 .append() 通常也不会触发它,尽管这可能取决于您正在运行的 python 实现。这是出于上述原因 - 解释器使用快捷方式来完成一些核心内置类的工作。

关于python - 附加到列表时未调用 Setattr 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62827203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com