python - 附加到列表时未调用 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])
解决方案
__setattr__()
使用以下语法时调用:
obj.key = value
# obj.__setattr__('key', value)
请注意,调用方法(例如调用.append()
)不会激活它,因为您没有直接对其进行任何设置。(虽然检索append
方法会触发__getattr__()
)。
在大多数情况下,如果你设计了一个类,你最终会__setattr__()
在某个时候调用——但对于大多数内置类,功能被抽象出来,通过宏或其他“跳过”的东西来处理__setattr__()
步。
请注意,该__setitem__()
方法也存在于某些对象上(不是全部!),并且不同于__setattr__()
因为它被不同的语法调用:
obj[key] = value
# obj.__setitem__('key', value)
但是,据我记得,调用.append()
列表通常也不会触发它,尽管它可能取决于您正在运行的 python 实现。这是出于上述原因 - 解释器使用快捷方式来完成某些核心内置类的工作。
推荐阅读
- huggingface-transformers - 使用/指定 attention_mask 使用 Trainer 和 TrainingArguments 训练 GPT2
- powerbi - 有没有其他方法可以根据层次过滤器进行度量?
- lightningchart - Auto adjust label positions
- hadoop - ZK hbase 复制节点呈指数增长,尽管 hbase 数据为对等方正确复制
- linux - ELF 可执行文件:许多零字节
- java - 四规则计算
- pyspark - 如何使用 pandas_udf 接口编写 pyspark 函数?
- java - 基于字节数组的ECPublicKey生成
- django - Django 帖子不起作用(无法访问您的文件)错误
- c++ - 模板不能推断类型