如何解决将__hash__和__eq__添加到导入的类型tkinter DoubleVar中,以将其放入字典中
我从其他模块导入了一些类(在我的应用程序中是tkinter DoubleVar),并希望将它们用作字典中的键。但是该类没有定义__hash__
和__eq__
,因此无法正常工作。
是否可以添加这些方法?我来自C#,那里有扩展方法,但我只是查找了一下,却没有找到在python中复制它的方法。
示例:
import tkinter as t
root = t.Tk()
var_A = t.DoubleVar(root)
var_A.set(10)
bounds = {} #I need to store the bounds for some optimization algorithm
bounds.update({var_A: [-10,10]}) #Throws exception : TypeError: unhashable type: 'DoubleVar'
我可以以某种方式在导入的类型中实现哈希功能吗?
还是我必须编写一个包装器类,以允许我在实现.get()
时访问.set()
和__hash__
方法?
编辑:我将尝试解释为什么需要存储边界:我有一个具有拟合功能的交互式模型。用户可以在不同算法之间进行选择。我所有的旧算法(来自scipy.optimize.minimize)都不需要边界,但是由于我想实现黑盒优化(使用this repo)并且算法需要边界,因此我需要某种方法来获取边界参数。但是由于有大约40个不同的参数和1500行以上的代码,我一直在寻找一种无需过多努力即可实现此目标的方法。由于所有变量(适合拟合的参数)都存储在self中,因此我想为边界创建一种“查找表”。没错,这不是正确的处理方式,但是无论如何我现在都找到了更好的解决方案。谢谢
解决方法
您可以将方法(包括__hash__
和类似方法分配给现有的类:
# a class without explicit __hash__
class A:
def __init__(self,i):
self.i = i
a1 = A(1)
print(hash(a1)) # default hash
# define a "free" function ...
def A_hash(self):
return hash(self.i)
# ... and "binds" it to class A
A.__hash__ = A_hash
a2 = A(1)
print(hash(a2)) # new it has user defined hash
编辑:使用最初不可哈希的对象和字典测试更新代码:
# a class without explicit __hash__
class A(list):
def __init__(self,i):
self.i = i
a1 = A(1)
# print(hash(a1)) # would be TypeError: unhashable type: 'A'
# define a "free" function ...
def A_hash(self):
return hash(self.i)
# ... and "binds" it to class A
A.__hash__ = A_hash
a2 = A(1)
print(hash(a2)) # new it has user defined hash
d = {a2:1}
print(d)
,
我通过编写实现__hash__
和__eq__
的包装器类解决了我的问题。该类还存储了变量,并提供了.get()
和.set()
,因此我不需要更改所有代码。
此外,我后来摆脱了将变量存储在有界的字典中的想法,而是将from_
和to
存储在包装器中,无论如何这都有意义
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。