我想将一个对象表示为一个字符串,以便它既可以作为字典键也可以作为对象访问。即
class test(object):
def __init__(self, name, number_array):
self.name = name
self.number_array = number_array
self.graph= barChart(number_array)
sample_obj = test('test_object', [(x1,y1), (x2,y2)etc.])
但{sample_obj: another_object}
看起来像{'test_object': another_object}
虽然仍然可以做这样的事情:
for key, val in sample_dict.items(): print(key.name, key.graph)
以及:
>>> sample_dict['test_object']
another_object
答案 0 :(得分:1)
您必须定义 eq ,在与字符串比较时返回正数,例如:
def __eq__(self, other):
if self.name == other:
return True
... continue with comparison ...
您还必须定义哈希,它返回与比较字符串相同的哈希值:
def __hash__(self):
return hash(self.name)
更新:以下代码完全符合作者的要求:
class test(object):
def __init__(self, name, number_array):
self.name = name
self.number_array = number_array
#self.graph= barChart(number_array)
def __eq__(self, other):
try:
return (self.name == other.name) and (self.number_array == other.number_array)
except AttributeError:
return self.name == other
def __hash__(self):
return hash(self.name)
sample_obj = test('test_object', [(0, 1), (2, 3)])
dict1 = {sample_obj: "Hurray"}
print("dict1[sample_obj]", dict1[sample_obj])
print("dict1['test_object']", dict1['test_object'])
dict2 = {'test_object': "Yippie"}
print("dict2[sample_obj]", dict2[sample_obj])
print("dict2['test_object']", dict2['test_object'])
答案 1 :(得分:1)
要将类用作字典键,请实现__hash__
和__eq__
。要在打印字典时更改的显示方式,请实施__repr__
:
class Test(object):
def __init__(self, name, number_array):
self.name = name
self.number_array = number_array
self.graph = barChart(number_array)
def __eq__(self, other):
return self.name == other.name and self.number_array == other.number_array
def __hash__(self):
return hash(self.name) ^ hash(self.number_array)
def __repr__(self):
return "test_object"
使用中:
>>> t = Test("foo", (1, 2, 3))
>>> d = {t: [1, 2, 3]}
>>> t
test_object
>>> d
{test_object: [1, 2, 3]}
>>> d[t]
[1, 2, 3]
请注意,这意味着name
和number_array
属性都必须是可清除的 - 我使用了字符串和元组来确保这一点。此外,如果__repr__
更接近地表示实际对象,例如
def __repr__(self):
return "Test({0.name!r}, {0.number_array!r})".format(self)