1

我有这个大学项目,我在老师提供的测试文件中遇到了几个错误。

他们中的大多数都与此有关。例如,执行以下操作:

caminho(posicao(0,0)).caminho_junta_posicao('este').caminho_origem()

返回:

Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AttributeError: 'NoneType' object has no attribute 'caminho_origem'

但是,这样做:

c1 = caminho(posicao(0,0))
c1.caminho_junta_posicao('este')
c1.caminho_origem()

不返回任何错误,而是返回预期的位置。

我不知道为什么会这样。Bellow 是定义示例中两个类的代码,因为我与其他人的问题非常相似。任何帮助将不胜感激。谢谢。

class posicao:
    def __init__(self,l,c):
        self.posicao=(l,c)
    def posicao_linha(self):
        return self.posicao[0]
    def posicao_coluna(self):
        return self.posicao[1]
    def posicao_igual(self,p2):
        return self.posicao[0] == p2.posicao_linha() and self.posicao[1]\
               == p2.posicao_coluna()
    def posicao_relativa(self,d):
        if d=='norte':
            return posicao(self.posicao_linha()-1,self.posicao_coluna())
        elif d=='sul':
            return posicao(self.posicao_linha()+1,self.posicao_coluna())
        elif d=='este':
            return posicao(self.posicao_linha(),self.posicao_coluna()+1)
        elif d=='oeste':
            return posicao(self.posicao_linha(),self.posicao_coluna()-1)




class caminho:
    def __init__(self,p):
        self.caminho = [p]
    def caminho_junta_posicao(self,d):
        p = self.caminho[-1]
        self.caminho = self.caminho + [p.posicao_relativa(d)]
    def caminho_origem(self):
        return self.caminho[0]
    def caminho_destino(self):
        return self.caminho[-1]
    def caminho_antes_destino(self):
        return self.caminho[:-1]
    def caminho_apos_origem(self):
        return self.caminho[1:]
    def caminho_comprimento(self):
        return len(self.caminho)
    def caminho_contem__ciclos(self):
        for p in range(len(self.caminho)):
            for p2 in self.caminho[p:]:
                if p2.posicao_igual(self.caminho[p]):
                    return True
        return False 
    def caminho_elimina_ciclos(self):
        caminho = self.caminho
        if self.caminho_contem_ciclos():
            for p in caminho:
                for p2 in caminho[caminho.index(p):]:
                    if p.posicoes_iguas(p2):
                        caminho = caminho[:index(p)]+caminho[index(p2):]
4

2 回答 2

0

您希望工作(但不工作)的代码不起作用,因为您的方法caminho_junta_posicao()没有显式返回值,这意味着它返回 None,从而导致您看到的错误。

你所说的代码确实有效(你的第二个例子),当我尝试它时实际上并没有工作(Python 3.1.3)——我得到了和以前一样的错误。

这是预期的,因为行为是一致的。

于 2012-12-18T20:25:31.810 回答
0

这种方法:

def caminho_junta_posicao(self,d):
    p = self.caminho[-1]
    self.caminho = self.caminho + [p.posicao_relativa(d)]

没有明确return的任何东西,所以调用它的结果是None. 所以,

 caminho(posicao(0,0)).caminho_junta_posicao('este')

将给出None,并且None没有caminho_origem()方法,因此您的错误。

Python 约定通常是就地执行的方法(如.append, .extend,这里是你的.caminho_junta_posicao) return None,这使得像这样的链接是不可能的。另一方面,它会导致意外地修改链中的原始对象,而您认为在副本上工作会变得更加困难。不过,有时链接确实会派上用场(pandas例如,请参阅库,它广泛使用它以获得巨大的好处。)

我不建议这样做,但如果你修改了self最后返回的方法,即

def caminho_junta_posicao(self,d):
    p = self.caminho[-1]
    self.caminho = self.caminho + [p.posicao_relativa(d)]
    return self

那么结果caminho(posicao(0,0)).caminho_junta_posicao('este')将是你的(现在修改的)caminho对象,你可以按照你尝试的方式链接它。

于 2012-12-18T20:26:25.263 回答