如何根据其他实例更新实例变量? 有没有办法在Python中获得对象之间的多对多依赖?
会发生什么: - S1的S2在线定义永远不会从其初始值改变。我不确定为什么,因为它被称为每个周期更新。
注意:S1可能依赖于s2中的多个属性,或者甚至可能依赖于S3,s4,基本上是任意数量的依赖。
这是我迄今为止所尝试过的:
import pygame
from pygame.locals import *
pygame.init()
class deptest():
def __init__(self,name):
self.name = name
self.status = ""
self.dependencies = {}
def updatestatus(self):
if self.checkdependencies():
self.status = "ONLINE"
else:
self.status = "OFFLINE"
def checkdependencies(self):
if self.dependencies:
for dv in self.dependencies.values():
dv=dv
if not all(dv for dv in self.dependencies.values()):
print("{}: Still waiting".format(self.name))
for ds,dv in self.dependencies.items():
print("{}: {}".format(ds,dv))
return False
else:
print("{}: Good to go".format(self.name))
return True
else:
print("{}: Good to go".format(self.name))
return True
s1 = deptest("s1")
s2 = deptest("s2")
s1.dependencies = {"S2 ONLINE":s2.status == "ONLINE"}
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == KEYDOWN:
if event.key == pygame.K_UP:
print("PRESSED UP")
if s1.checkdependencies():
s1.status = "ONLINE"
if event.key == pygame.K_DOWN:
print("PRESSED DOWN")
if s2.checkdependencies():
s2.status = "ONLINE"
for s in [s1,s2]:
s.updatestatus()
pygame.quit()
sys.exit()
这是我对类和实例如何工作的误解吗?
编辑:环顾四周,我认为这可能是“观察者”和“观察者”。设计模式。 编辑:或者也许'调解员' - 我不太确定。答案 0 :(得分:0)
有很多更好的方法可以做到这一点,但根据你在评论中的回答,一种方法是不使用字典作为依赖,而是使用类似列表的东西,并有一个方法用依赖项填充它,然后你的checkstatus
检查活动状态,而不是添加它时的状态。
将此添加到您的班级:
def __init__(self, name):
... ## all the other stuff
self.dependencies = []
def add_dependency(self, dependency):
self.dependencies.append(dependency)
和checkdependencies:
def checkdependencies(self):
if self.dependencies:
if all(s.status for s in self.dependencies):
return True
else:
...
并添加依赖项:
s1 = deptest('s1')
s2 = deptest('s2')
s1.add_dependency(s2)
... ## do the same check that you are doing here.
答案 1 :(得分:0)
要理解的第一件事是你没有在字典中捕捉某种表达的某种引用......你只是捕获当前值。看看这有助于理解这一点:
>>> a = "not ready"
>>> dependencies = {"a": a == "ready"}
>>> dependencies
{'a': False}
>>> a = "ready"
>>> dependencies
{'a': False}
请注意,更改a
的值不会更改字典中的值。
有几种方法可以实现您的目标,但我认为最适合您的用例的方法是存储函数并在每次要检查值时执行它:
>>> a = "not ready"
>>> dependencies = {"a": lambda: a == "ready"}
>>> dependencies
{'a': <function <lambda> at 0x10fc0cf28>}
>>> dependencies["a"]()
False
>>> a = "ready"
>>> dependencies["a"]()
True
在您的示例中,您可以执行以下操作来设置依赖项:
s1.dependencies = {"S2 ONLINE": lambda: s2.status == "ONLINE"}
然后你需要调用每个函数来检查依赖项:
if not all(f() for f in self.dependencies.values()):