我想把一个类的实例用作字典键,就像这样:
classinstance = class()
dictionary[classinstance] = 'hello world'
Python似乎无法处理类作为字典键,是我错了吗? 此外,我可以使用类似[(classinstance, helloworld), ...]的元组列表代替字典,但这看起来非常不专业。 你有什么方法来解决这个问题吗?
我想把一个类的实例用作字典键,就像这样:
classinstance = class()
dictionary[classinstance] = 'hello world'
Python似乎无法处理类作为字典键,是我错了吗? 此外,我可以使用类似[(classinstance, helloworld), ...]的元组列表代替字典,但这看起来非常不专业。 你有什么方法来解决这个问题吗?
您的实例需要是可哈希的。Python词汇表告诉我们:
如果一个对象在其生命周期内具有永远不变的哈希值(它需要一个
__hash__()
方法),并且可以与其他对象进行比较(它需要一个__eq__()
或__cmp__()
方法),则该对象是可哈希的。具有相同哈希值的可哈希对象必须相等。可哈希性使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。
所有Python的不可变内置对象都是可哈希的,而没有可变容器(如列表或字典)是可哈希的。默认情况下,用户定义类的实例都是可哈希的;它们都不相等,并且它们的哈希值是它们的id()。
Class Foo(object):
def __init__(self):
pass
myinstance = Foo()
mydict = {myinstance : 'Hello world'}
print mydict[myinstance]
输出: 你好,世界
此外,为了更高级的用法,您应该阅读这篇文章:
尝试在您的类中实现 hash 和 eq 方法。
例如,这是我制作的一个简单的可哈希字典类:
class hashable_dict:
def __init__(self, d):
self.my_dict = d
self.my_frozenset = frozenset(d.items())
def __getitem__(self, item):
return self.my_dict[item]
def __hash__(self):
return hash(self.my_frozenset)
def __eq__(self, rhs):
return isinstance(rhs, hashable_dict) and self.my_frozenset == rhs.my_frozenset
def __ne__(self, rhs):
return not self == rhs
def __str__(self):
return 'hashable_dict(' + str(self.my_dict) + ')'
def __repr__(self):
return self.__str__()
只要遵循规则,使用实例作为字典键是没有问题的:字典键必须是不可变的。
import pickle
import os
# Load object as dictionary ---------------------------------------------------
def load_object():
file_path = 'Strategy\\All_Pickles.hd5'
if not os.path.isfile(file_path):
return {}
with open(file_path, 'rb') as file:
unpickler = pickle.Unpickler(file)
return dict(unpickler.load())
# Save object as dictionary ---------------------------------------------------
def save_object(name, value):
file_path = 'Strategy\\All_Pickles.hd5'
object_dict = load_object()
with open(file_path, 'wb') as file:
object_dict[name] = value
pickle.dump(object_dict, file)
return True
class MyClass:
def __init__(self, name):
self.name = name
def show(self):
print(self.name)
save_object('1', MyClass('Test1'))
save_object('2', MyClass('Test2'))
objects = load_object()
obj1 = objects['1']
obj2 = objects['2']
obj1.show()
obj2.show()
我创建了一个类的两个对象,并调用了该类的一个方法。 希望这可以帮到你。