覆盖__getitem__进行更新

时间:2018-06-13 12:18:54

标签: python dictionary subclass

我正在实现一个继承自UserDict的类。这个类完全按预期行事,但我想扩展它的功能。我希望它能够在处理字典时通过所有已被覆盖的方法。一个例子是:

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并使用基本方法更新。

Doing some stuff here
New dict: {'one': {'two': 4}}

我希望dd["one"]是一个可以修改的对象,可以调用修改后的setitem而无需dd.update({"one": {"two": 4}})

我的问题是哪种方法最好?在上面的例子中,我应该使用getitem返回一个对象,修改它并返回它吗?我希望它尽可能通用。

与问题密切相关:

Subclassing Python dictionary to override __setitem__

但我想知道现在是否有新方法。

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您可以将您提供的内部词典作为值添加到您班级的另一个实例中。如果您希望自动执行此操作,我建议您为 render() { console.log(this.state.width) let inputStyle = { color: '#fff', // width: this.state.width, fontSize: 60, lineHeight: 60, fontFamily: 'GT-Walsheim-Bold' } return ( <View style={styles.containerStyle}> <Text style={styles.labelStyle}>{this.props.label}</Text> <TextInput secureTextEntry={this.props.secureTextEntry} placeholder={this.props.placeholder} autoCorrect={false} style={inputStyle} value={this.props.value} onChangeText={this.props.onChangeText} autoFocus={true} autoCapitalize={this.props.capitalize} /> </View> ); } const styles = { labelStyle: { fontSize: 36, fontFamily: 'GT-Walsheim-Bold' }, containerStyle: { height: 200, flex: 1, alignItems: 'center', justifyContent: 'center', textAlign: 'center' } }; 中传递的任何字典值执行此操作,因为这样可以让您稍后改变包装器对象,同时保留引用在你的数据中。

尝试这样的事情:

__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