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
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.)
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()
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 return
ing 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
.
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.
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 .)
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.