web-dev-qa-db-fra.com

Erreur de méthode liée

Je crée une classe d'analyse Word et continue d'obtenir une erreur "méthode liée Word_Parser.sort_Word_list de <main. Word_Parser à 0x1037dd3b0>" lorsque j'exécute ceci:

class Word_Parser:
    """docstring for Word_Parser"""
    def __init__(self, sentences):
        self.sentences = sentences

    def parser(self):
        self.Word_list = self.sentences.split()

    def sort_Word_list(self):
        self.sorted_Word_list = self.Word_list.sort()

    def num_words(self):
        self.num_words = len(self.Word_list)

test = Word_Parser("mary had a little lamb")
test.parser()
test.sort_Word_list()
test.num_words()
print test.Word_list
print test.sort_Word_list
print test.num_words
28
Michael Conlin

Il n'y a pas d'erreur ici. Vous imprimez une fonction, et c'est à cela que ressemblent les fonctions.

Pour réellement appeler la fonction, vous devez mettre des parenthèses après cela. Vous faites déjà cela ci-dessus. Si vous souhaitez imprimer le résultat de l'appel de la fonction, il suffit que la fonction renvoie la valeur et y place l'impression. Par exemple:

print test.sort_Word_list()

D'un autre côté, si vous voulez que la fonction mute l'état de l'objet, puis imprime l'état d'une autre manière, c'est bien aussi.

Maintenant, votre code semble fonctionner à certains endroits, mais pas à d'autres; regardons pourquoi:

  • parser définit une variable appelée Word_list, et vous plus tard print test.Word_list, donc ça marche.
  • sort_Word_list définit une variable appelée sorted_Word_list, et vous plus tard print test.sort_Word_list— c'est-à-dire la fonction, pas la variable. Ainsi, vous voyez la méthode liée. (De plus, comme le souligne Jon Clements, même si vous corrigez ce problème, vous allez imprimer None, car c'est ce que sort renvoie.)
  • num_words définit une variable appelée num_words, et vous imprimez à nouveau la fonction — mais dans ce cas, la variable a le même nom que la fonction, ce qui signifie que vous remplacez réellement la fonction par sa sortie, donc ça marche. Mais ce n'est probablement pas ce que vous voulez faire.

(Il y a des cas où, à première vue, cela semble être une bonne idée - vous ne voulez calculer quelque chose qu'une seule fois, puis y accéder encore et encore sans recalculer constamment cela. Mais ce n'est pas la façon de faire Utilisez soit un @property, ou utilisez un décorateur de mémorisation.)

57
abarnert

Ce problème se produit à la suite de l'appel d'une méthode sans crochets. Jetez un œil à l'exemple ci-dessous:

class SomeClass(object):
    def __init__(self):
        print 'I am starting'

    def some_meth(self):
        print 'I am a method()'

x = SomeClass()
''' Not adding the bracket after the method call would result in method bound error '''
print x.some_meth
''' However this is how it should be called and it does solve it '''
x.some_meth()
8
blakroku

Vous avez une méthode d'instance appelée num_words, Mais vous avez également une variable appelée num_words. Ils ont le même nom. Lorsque vous exécutez num_words(), la fonction se remplace par sa propre sortie, qui probablement n'est pas ce que vous voulez faire. Considérez returning vos valeurs.

Pour résoudre votre problème, remplacez def num_words Par quelque chose comme def get_num_words Et votre code devrait fonctionner correctement. Modifiez également print test.sort_Word_list En print test.sorted_Word_list.

3
Blender

Je pense que vous vouliez dire print test.sorted_Word_list Au lieu de print test.sort_Word_list.

De plus, list.sort() trie une liste sur place et retourne None, vous souhaiterez donc probablement modifier sort_Word_list() pour effectuer les opérations suivantes:

self.sorted_Word_list = sorted(self.Word_list)

Vous devez également envisager de renommer votre fonction num_words() ou de modifier l'attribut auquel la fonction est affectée, car vous remplacez actuellement la fonction par un entier au premier appel.

1
Andrew Clark

Le problème de syntaxe est la méthode d'observation et les noms de variables. Dans la version actuelle, sort_Word_list() est une méthode et sorted_Word_list Est une variable, tandis que num_words Est les deux. De plus, list.sort() modifie la liste et la remplace par une version triée; la fonction sorted(list) renvoie en fait une nouvelle liste.

Mais je soupçonne que cela indique un problème de conception. À quoi servent les appels

test.parser()
test.sort_Word_list()
test.num_words()

qui ne font rien? Vous devriez probablement demander aux méthodes de déterminer si le comptage et/ou le tri appropriés ont été effectués et, le cas échéant, effectuer le comptage ou le tri et sinon simplement renvoyer quelque chose.

PAR EXEMPLE.,

def sort_Word_list(self):
   if self.sorted_Word_list is not None:
      self.sorted_Word_list = sorted(self.Word_list)
   return self.sorted_Word_list

(Alternativement, vous pouvez utiliser propriétés .)

0
Andrew Jaffe

Vos commentaires utiles m'ont conduit à la solution suivante:

class Word_Parser:
    """docstring for Word_Parser"""
    def __init__(self, sentences):
        self.sentences = sentences

    def parser(self):
        self.Word_list = self.sentences.split()
        Word_list = []
        Word_list = self.Word_list
        return Word_list

    def sort_Word_list(self):
        self.sorted_Word_list = sorted(self.sentences.split())
        sorted_Word_list = self.sorted_Word_list
        return sorted_Word_list

    def get_num_words(self):
        self.num_words = len(self.Word_list)
        num_words = self.num_words
        return num_words

test = Word_Parser("mary had a little lamb")
test.parser()
test.sort_Word_list()
test.get_num_words()
print test.Word_list
print test.sorted_Word_list
print test.num_words

et renvoie: ['mary', 'had', 'a', 'little', 'lamb'] ['a', 'had', 'lamb', 'little', 'mary'] 5

Merci à tous.

0
Michael Conlin