我正在实现一个继承自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__
但我想知道现在是否有新方法。
感谢任何帮助
答案 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