我想从中派生一个类list
,向它添加一些实例属性,并使其可散列。什么是好的(快速而整洁的)方法?
更新:
我删除了一个用例的冗长解释。我还将一个相关但单独的问题移到了另一个问题中。
这段代码很好。您正在制作列表的副本,这可能会有点慢。
def __hash__(self):
return hash(tuple(self.list_attribute))
如果你想更快,你有几个选择。
list_attribute
为元组,而不是列表(完全构造后)您可以tuple
申请self
:
class State(list):
def __hash__(self):
return hash((self.some_attribute, tuple(self)))
tuple
-ingself
大约需要整个散列过程的一半时间:
from timeit import timeit
setup = "from __main__ import State; s = State(range(1000)); s.some_attribute = 'foo'"
stmt = "hash(s)"
print(timeit(stmt=stmt, setup=setup, number=100000))
setup = "r = list(range(1000))"
stmt = "tuple(r)"
print(timeit(stmt=stmt, setup=setup, number=100000))
印刷
0.9382011891054844
0.3911763069244216
这更像是评论而不是答案,但是评论太长了。这是从内部访问实例属性的方式__new__
:
class Data(tuple):
def __new__(klass, arg):
data_inst = tuple.__new__(klass, arg)
data_inst.min = min(data_inst)
data_inst.max = max(data_inst)
return data_inst
>>> d = Data([1,2,3,4])
>>> d
(1, 2, 3, 4)
>>> d.min
1
>>> d.max
4
>>> d1 = Data([1,2,3,4,5,6])
>>> d1.max
6
>>> d.max
4