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() 

这是我关于类和实例是如何工作的一部分的误解?

编辑:环顾一下,我认为这可能是'观察者'的设计模式。 编辑:或者也许'调解员' - 我不太确定。

+0

这总是错误的s1.dependencies = {“S2 ONLINE”:s2.status ==“ONLINE”}'你是否期望它翻转为'True'? – salparadise

+0

是的,当s2.status更新为“ONLINE”时。这是我想的关键。 – Metalgearmaycry

很多更好的方法来做到这一点,但根据你在评论中的回答,一种方法是不使用字典作为依赖关系,而是使用类似列表的方式,并且有一种方法用依赖关系填充它,然后你的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. 
+0

好的,我可以理解。但是,这将如何工作来检查实例变量或其他实例变量的实际值;在我的例子中说s1需要s2.status =“ONLINE”以及s2.var == 3? – Metalgearmaycry

+0

简单's.status =='ONLINE'和s.var == 3 s在...' – salparadise

+0

我编辑了我的问题来澄清:这将如何工作的任意数量的系统和依赖关系?有没有我可以使用的设计模式? – 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()):