我想将一个存储容器位置传递给一个类。有没有比传递命令和 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
