Skip to main content
 首页 » 编程设计

python之将 dict 与 key 一起传递以传递存储位置是否有意义更好的方法

2025年05月04日12lexus

我想将一个存储容器位置传递给一个类。有没有比传递命令和 key 更好的方法呢?传递 key 感觉有点奇怪,但它似乎有效。

class GuiWidget(): 
    def __init__(self, storageDict, storageDictKey): 
        self.storageDict = storageDict 
        self.storageDictKey = storageDictKey 
    def inc(self): 
        self.storageDict[self.storageDictKey] += 1  # in real problem store image 
 
storage = {"k1":0, "k2":0} 
 
w1 = GuiWidget(storage, "k1") 
w2 = GuiWidget(storage, "k2") 
 
 
# calls from gui thread 
print storage 
w1.inc() 
print storage 
w2.inc() 
print storage 
 
##{'k2': 0, 'k1': 0} 
##{'k2': 0, 'k1': 1} 
##{'k2': 1, 'k1': 1} 

---编辑---

虽然我会做得更冗长一点,但我喜欢安德烈的方式。它适用于字典或列表。它也给了我这个带有类的解决方案的想法,尽管使用上的差异看起来更美观:

class GuiWidget(object): 
    def __init__(self, connector): 
        self.connector = connector 
    def inc(self): 
        self.connector.v = (self.connector.v + 1) 
 
class Connector(object): 
    def __init__(self, container, key): 
        self.container = container 
        self.key = key 
    def get_f(self): 
        return self.container[self.key] 
    def set_f(self, z): 
        self.container[self.key] = z 
    v = property(fget=get_f, fset=set_f) 
 
storage = {"k1":0, "k2":0} 
storageList = [0] 
 
w1 = GuiWidget(Connector(storage, "k1")) 
w2 = GuiWidget(Connector(storage, "k2")) 
w3 = GuiWidget(Connector(storageList, 0)) 
 
 
# calls from gui thread 
print storage 
w1.inc() 
print storage 
w2.inc() 
print storage 
w3.inc() 
print storageList 
 
##{'k2': 0, 'k1': 0} 
##{'k2': 0, 'k1': 1} 
##{'k2': 1, 'k1': 1} 
##[4] 

所有这些让我想起了在 C 中传递一个指向结构体的指针。

请您参考如下方法:

我猜你想消除你的类对存储访问方法的依赖。这是我的解决方案:

class GuiWidget(): 
    def __init__(self, accessFunc): 
        self.accessFunc = accessFunc 
    def inc(self): 
        self.accessFunc(self.accessFunc() + 1) 
 
storage = {"k1":0, "k2":0} 
 
def getAccessFunc(key): 
    return lambda v = None: v is not None and storage.update({key: v}) or storage[key] 
 
w1 = GuiWidget(getAccessFunc("k1")) 
w2 = GuiWidget(getAccessFunc("k2")) 
 
 
# calls from gui thread 
print storage 
w1.inc() 
print storage 
w2.inc() 
print storage