Python依赖项:访问另一个实例变量

时间:2017-07-16 18:00:41

标签: python oop instance observer-pattern mediator

如何根据其他实例更新实例变量? 有没有办法在Python中获得对象之间的多对多依赖?

  • Deptest是一个可以是ONLINE或OFFLINE的类,它有一个字典实例变量,名为" Dependencies"设置如此{" CONDITION STRING":instance.instancevariable == value}
  • S1和S2是Deptest的实例
  • S1要求S2在线以便在线制作
  • 如果按下UP,则检查S1的依赖性。如果满足,S1现在在线。
  • 如果按下DOWN,则检查S2的依赖关系。由于它没有,它是在线制作的。

会发生什么:   - 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()

这是我对类和实例如何工作的误解吗?

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

2 个答案:

答案 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()):