我正在尝试为字符串创建自定义哈希函数。我想通过字符频率按权重对字符串进行哈希处理。这样hi
和ih
将产生相同的哈希值。我可以覆盖__hash__
吗?
还是创建一个包含字符串并覆盖__hash__
和__eq__
的包装类是唯一的方法?
import collections
class FrequencyString(str):
@property
def normalized(self):
try:
return self._normalized
except AttributeError:
self._normalized = normalized = ''.join(sorted(collections.Counter(self).elements()))
return normalized
def __eq__(self, other):
return self.normalized == other.normalized
def __hash__(self):
return hash(self.normalized)
dict = {},dict [5] = value
会将value
插入到位置5还是键'5'? - darksky你的假设是正确的,你不能在Python中覆盖基类。虽然可以重写str()
会做什么,但对于字符串字面值不起作用。
如果您正在为Python 2.2之前编写代码,请查看UserString
类,如果要创建自己的类:http://docs.python.org/2/library/userdict.html#module-UserString
否则,您可以简单地继承str
或unicode
在您的情况下,如果您想将其用作字典键,则仅覆盖__hash__
方法就足够了。但如果您正在查看比较,则必须覆盖__eq__
或__cmp__
UserString
,那是古老的历史了。只需从str
继承即可,例如class mystr(str): ...
。 - Jon Clementsstr
子类化。那该怎么做呢?只需要这样吗:class wrapper_class(str):
?仅覆盖__hash__
和__eq__
就足够了吗? - darksky__hash__
和__eq__
是否足够? - darksky你可以继承自str
,但由于它们是不可变的,所以你必须以稍微不同的方式对它们进行子类化。最有可能的是,你想要从现有字符串创建新的字符串,因此你还必须重写__new__
方法。你可能还需要添加额外的特殊方法来打败Python所做的优化。
这里有一个内置str
的子类化示例,mapstr对象允许在表单中轻松替换占位符。
__init__
的字符串,那我为什么需要子类化__new__
呢?如果我不这样做会发生什么? - darksky
str
和custom_str
可能会很有趣 :) - Jon Clementsih
替换hi
吗? - Keith