似乎不能调用有两个类的程序。Python初学者,希望学习更多关于调用规则的知识

2024-10-01 04:51:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我处理的是下面的Water Buckets程序,我似乎无法调用该程序,因为它是两个类,第一个类与第二个类一起使用。我只是一个初学者,所以我想知道在调用过程中我做错了什么,像我这样的初学者应该注意哪些规则来避免这些问题。你知道吗

我做了一些研究,但是我发现很难调整解决方案来解决这个问题,因为我不确定当它说“dict”object has no attribute“has \u key”时的错误是什么意思。如果可以用更简单的术语来表达,那就太好了,因为许多人(包括我)对CS和Python都是新手。你知道吗

代码:

class manager:
    """ Manage game queue. keep track of states already seen
      and who their parent states are"""
    def __init__ (self) :
        self.queue = []
        self.seen  = {}

    def getState (self) :
        "return next state and pop it off the queue"

        if not self.queue : return None
        state = self.queue[0]
        self.queue = self.queue[1:]
        return state

    def addState (self, parentState, newState) :
        "add state if it's new. Remember its parent"
        if self.seen.has_key(str(newState)) : return
        self.seen[str(newState)] = str(parentState)
        self.queue.append (newState)
        #print '--- Adding ', newState

    def getSolution (self) :
        "Return solution from latest state added"
        solution = []
        state = self.queue[-1]
        while state :
            solution.append (str(state))
            state = self.getParent(state)
        solution.reverse()
        return solution

    def getParent (self, childState) :
        """return parent of state, if it exists"""
        try    : return self.seen[str(childState)]
        except : return None

class bucketPlayer:
    def __init__ (self, manager) :
        self.manager = manager

    def test (self, oldstate, newstate) :
        [newA, newB] = newstate
        won = (newA == self.goal or newB == self.goal)
        self.manager.addState (oldstate, newstate)
        return won

    def playGame (self, aMax, bMax, goal) :
        "grab a state and generate 8 more to submit to the manager"
        self.goal = goal
        self.manager.addState("", [0,0])   # start with 2 empty buckets
        while 1 :
            oldstate = self.manager.getState()
            [aHas,bHas] = oldstate
            if self.test (oldstate, [aMax,bHas]): break # fill A from well
            if self.test (oldstate, [0   ,bHas]): break # empty A to well
            if self.test (oldstate, [aHas,bMax]): break # fill B from well
            if self.test (oldstate, [aHas,0   ]): break # empty B to well
            howmuch = min(aHas, bMax-bHas)
            if self.test (oldstate, [aHas-howmuch,bHas+howmuch]): break # pour A to B
            howmuch = min(bHas, aMax-aHas)
            if self.test (oldstate, [aHas+howmuch,bHas-howmuch]): break # pour B to A
        print ("Solution is: ")
        print (string.join (self.manager.getSolution(), "\n"))


m = manager()
p = bucketPlayer(m)
# A=7 liters, B=11 liters, Want=6
p.playGame(7,11,6)

错误:

Traceback (most recent call last):
  File "/Applications/Python 3.4/Portfolio Projects/Project 4.py", line 70, in <module>
    p.playGame(7,11,6)
  File "/Applications/Python 3.4/Portfolio Projects/Project 4.py", line 51, in playGame
    self.manager.addState("", [0,0])   # start with 2 empty buckets
  File "/Applications/Python 3.4/Portfolio Projects/Project 4.py", line 18, in addState
    if self.seen.has_key(str(newState)) : return
AttributeError: 'dict' object has no attribute 'has_key'

Tags: testselfreturnifqueuedefmanagerhas