2017-07-16 90 views
0

如何根據另一個實例更新實例變量? 有沒有辦法在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

回答

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. 
+0

好的,我可以理解。但是,這將如何工作來檢查實例變量或其他實例變量的實際值;在我的例子中說s1需要s2.status =「ONLINE」以及s2.var == 3? – Metalgearmaycry

+0

簡單's.status =='ONLINE'和s.var == 3 s在...' – salparadise

+0

我編輯了我的問題來澄清:這將如何工作的任意數量的系統和依賴關係?有沒有我可以使用的設計模式? – Metalgearmaycry

0

首先要明白的是,你」不要捕獲某種對字典中表達式的引用......你只是捕獲當前的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()): 
相關問題