同事!给定一个具有列表或字典类型属性的类。任务:更改此列表/字典的元素之一,但尽管我们可以通过字符串变量或字符串常量使用属性名称。我知道使用内置对象的一种方法__dict__:
class MyClass:
def __init__(self):
self.attr: dict[str, int] = {'key1': 5,
'key2': 7,
'key3': 42}
my_class = MyClass()
attr_name = 'attr'
print(my_class.attr['key2'])
my_class.__dict__[attr_name]['key2'] = 12
print(my_class.attr['key2'])
问题:
这种方法在多大程度上可以被接受?还有其他更合适的方法吗?
对于带有属性的操作,最好使用内置函数
delattr,hasattr,getattr,setattr。原因是 Python 中的对象不需要将属性存储在
__dict__. 派生类型可以通过重载__getattr__,__get_attribute__, ,__delattr__,__setattr__方法来覆盖属性访问。内置函数{has,get,set,del}attr可以处理此类对象。对于你的例子:
结果
在示例中,我没有使用
setattr属性值来更新,因为字典通过引用存储数据,并且可以直接将值分配给键getattr(my_class, attr_name)['key2'] = 12。