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

エラーは返されませんが、意図した位置が返されます。

そして、なぜそれが起こるのか理解できません。他の人との私の問題は非常に似ているので、以下は例の両方のクラスを定義するコードです。どんな助けでも本当にありがたいです。ありがとう。

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 が返され、表示されているエラーが発生します。

あなたが述べたコードは機能しましたが(2番目の例)、実際に試してみると機能しませんでした(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、ここでは your .caminho_junta_posicao) は を返します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 に答える