python - 覆盖 Python 中的特殊函数

标签 python inheritance

有没有办法覆盖 python 中内置类型的特殊函数?例如,我想创建一个继承自内置字典的 SpecialDict 类。我想允许用户为我的特殊字典中的键和值定义自定义验证函数,如下所示:

def __init__(self, keyValidator = True, valueValidator = True):
    self.keyValidator = keyValidator
    self.valueValidator = valueValidator

使用它,我可以拦截更新方法中的值添加,如下所示:

def update(self,key,value):
    assert (self.keyValidator(key))
    assert (self.valueValidator(key))
    self[key] = value

但如果有人决定继续使用 [] 作为访问权限,这将不起作用。或者如果有人使用字典文字创建对象。

mySpecialDict = SpecialDict
mySpecialDict['hello'] = 54

最佳答案

有人不能将您的 SpecialDict 实例创建为字典文字,因为字典文字就是这样;普通字典。

至于使用方括号表示法设置项目,如 mySpecialDict['hello'] = 54,它正好对应于 mySpecialDict.__setitem__('hello', 54)。同样,使用方括号表示法检索项目对应于 __getitem__ 方法的调用。无论 mySpecialDict 是什么类都是如此;无论是普通字典、内置 dict 的子类,还是一些完全不相关的类。因此,您可以只实现这些方法来改变它们的作用(使用 super(SpecialDict, self).__setitem__(key, value)dict.__setitem__(self, key, value) 以在需要时引用正常的实现)。

您将遇到的一个问题是其他字典方法的某些(全部?)内置实现不会遵守您覆盖的 __setitem____getitem__。所以你将无法继承它们;您必须重写所有这些并根据您的基本操作版本完全重新实现它们,或者至少“围绕”父类(super class)调用运行您的验证。

实际上,一种不那么痛苦的方法可能是对内置字典进行子类化,而是实现一个包装普通字典的自定义“类字典”对象,使用collections.Mappingcollections.MutableMapping 基类来获取字典接口(interface)。使用这种方法,您只需要自己实现大约 6 个基本方法(您可以通过围绕对包装字典的调用插入验证逻辑来​​实现),并基于它们获得其他方法的合理定义。参见 http://docs.python.org/library/collections.html#collections-abstract-base-classes

关于python - 覆盖 Python 中的特殊函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644417/

相关文章:

python - 使用 H.323 测试遗留语音邮件系统

python - 访问hadoop作业跟踪器ui

python - 如何在 Python 中将 DWORD 转换为字符串

python - 连接不同形状的 numpy 数组

java - 为什么 method() 和 super.method() 在匿名子类中引用不同的东西?

c++ - 经过一些计算后在基类之后调用参数化构造函数

C++ 继承自在另一个类中用作类型的类

python - 将字符串解析为 JSON

c# - 泛型接口(interface)的非泛型类实现不被继承

inheritance - Scala中是否有一个“SELF”类型代表当前类型?