覆盖 __getitem__ 以更新
Override __getitem__ to update
我正在实现一个继承自 UserDict 的 class。 class 完全符合预期,但我想扩展它的功能。我希望它通过所有在对字典进行操作时被覆盖的方法。一个例子是:
from collections import UserDict
class DummyClass(UserDict):
def __init__(self):
self.mine = {}
self.data = self.mine
def __getitem__(self, key):
print("Doing some stuff here")
return self.data[key]
def __setitem__(self, key, value):
print(f"Uses my __setitem__ {key} {value}")
self.data[key] = value
做的时候:
dd = DummyClass()
dd["one"] = {"two": 2}
print(f"First dict: {dd}")
输出为:
Uses my __setitem__ one {'two': 2}
First dict: {'one': {'two': 2}}
然而,
dd["one"].update({"two": 4})
print(f"New dict: {dd.keys()}")
将使用修改后的getitem并使用基本方法update。
Doing some stuff here
New dict: {'one': {'two': 4}}
我想要的是 dd["one"]
是一个可以修改的对象,调用修改后的 setitem 而不必执行 dd.update({"one": {"two": 4}})
我的问题是最好的解决方法是什么?在上面的例子中,我应该 return 一个带有 getitem 的对象,修改它并 return 它吗?我希望它尽可能通用。
与问题密切相关:
Subclassing Python dictionary to override __setitem__
但我想知道现在是否有新的方法来解决这个问题。
感谢任何帮助
您可以将给定的内部字典作为值包装在 class 的另一个实例中。如果您希望它自动发生,我建议对您在 __setitem__
中传递的任何字典值执行此操作,因为这样可以让您稍后在适当的位置改变包装器对象,同时在您的文件中保留对它的引用数据.
尝试这样的事情:
def __setitem__(self, key, value):
print(f"Uses my __setitem__ {key} {value}")
if isisnstance(value, dict):
wrapper = DummyClass() # if __init__ accepts arguments use: value = DummyClass(value)
wrapper.update(value)
value = wrapper
self.data[key] = value
示例输出:
>>> dd = DummyClass()
>>> dd["one"] = {"two": 2}
Uses my __setitem__ one {'two': 2}
Uses my __setitem__ two 2
>>> dd["one"].update({"two": 4})
Doing some stuff here
Uses my __setitem__ two 4
>>> print(dd)
{'one': {'two': 4}}
我正在实现一个继承自 UserDict 的 class。 class 完全符合预期,但我想扩展它的功能。我希望它通过所有在对字典进行操作时被覆盖的方法。一个例子是:
from collections import UserDict
class DummyClass(UserDict):
def __init__(self):
self.mine = {}
self.data = self.mine
def __getitem__(self, key):
print("Doing some stuff here")
return self.data[key]
def __setitem__(self, key, value):
print(f"Uses my __setitem__ {key} {value}")
self.data[key] = value
做的时候:
dd = DummyClass()
dd["one"] = {"two": 2}
print(f"First dict: {dd}")
输出为:
Uses my __setitem__ one {'two': 2}
First dict: {'one': {'two': 2}}
然而,
dd["one"].update({"two": 4})
print(f"New dict: {dd.keys()}")
将使用修改后的getitem并使用基本方法update。
Doing some stuff here
New dict: {'one': {'two': 4}}
我想要的是 dd["one"]
是一个可以修改的对象,调用修改后的 setitem 而不必执行 dd.update({"one": {"two": 4}})
我的问题是最好的解决方法是什么?在上面的例子中,我应该 return 一个带有 getitem 的对象,修改它并 return 它吗?我希望它尽可能通用。
与问题密切相关:
Subclassing Python dictionary to override __setitem__
但我想知道现在是否有新的方法来解决这个问题。
感谢任何帮助
您可以将给定的内部字典作为值包装在 class 的另一个实例中。如果您希望它自动发生,我建议对您在 __setitem__
中传递的任何字典值执行此操作,因为这样可以让您稍后在适当的位置改变包装器对象,同时在您的文件中保留对它的引用数据.
尝试这样的事情:
def __setitem__(self, key, value):
print(f"Uses my __setitem__ {key} {value}")
if isisnstance(value, dict):
wrapper = DummyClass() # if __init__ accepts arguments use: value = DummyClass(value)
wrapper.update(value)
value = wrapper
self.data[key] = value
示例输出:
>>> dd = DummyClass()
>>> dd["one"] = {"two": 2}
Uses my __setitem__ one {'two': 2}
Uses my __setitem__ two 2
>>> dd["one"].update({"two": 4})
Doing some stuff here
Uses my __setitem__ two 4
>>> print(dd)
{'one': {'two': 4}}