首页 > 解决方案 > 附加到列表时未调用 Setattr 方法

问题描述

为什么在未调用附加或连接对象属性的列表或字典__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])

标签: pythonpython-3.x

解决方案


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

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

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

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


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

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

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


推荐阅读