Python依赖关系:用于访问另一个实例变量的类方法
如何根据另一个实例更新实例变量? 有没有办法在Python中的对象之间获得多对多的依赖关系?Python依赖关系:用于访问另一个实例变量的类方法
- Deptest是其可以是在线或离线的一类,并且它具有所谓的“相关性”的字典实例变量是像这样设置{“CONDITION STRING”:instance.instancevariable ==值}
- S1和S2是Deptest的实例
- S1要求S2在线以便进行在线
- 如果按下UP,则检查S1的依赖关系。如果他们符合,S1现在在线。
- 如果按下DOWN,则会检查S2的相关性。由于它没有,它是在网上。
发生了什么: - S1的在线定义从不改变其初始值。我不知道为什么,因为它被称为每个周期更新。
注意: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()
这是我关于类和实例是如何工作的一部分的误解?
编辑:环顾一下,我认为这可能是'观察者'的设计模式。 编辑:或者也许'调解员' - 我不太确定。
很多更好的方法来做到这一点,但根据你在评论中的回答,一种方法是不使用字典作为依赖关系,而是使用类似列表的方式,并且有一种方法用依赖关系填充它,然后你的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.
好的,我可以理解。但是,这将如何工作来检查实例变量或其他实例变量的实际值;在我的例子中说s1需要s2.status =“ONLINE”以及s2.var == 3? – Metalgearmaycry
简单's.status =='ONLINE'和s.var == 3 s在...' – salparadise
我编辑了我的问题来澄清:这将如何工作的任意数量的系统和依赖关系?有没有我可以使用的设计模式? – Metalgearmaycry
首先要明白的是,你”不要捕获某种对字典中表达式的引用......你只是捕获当前的VA略。看看这有助于理解这一点:
>>> 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()):
这总是错误的s1.dependencies = {“S2 ONLINE”:s2.status ==“ONLINE”}'你是否期望它翻转为'True'? – salparadise
是的,当s2.status更新为“ONLINE”时。这是我想的关键。 – Metalgearmaycry