J'étais sous l'impression que les méthodes dans les classes Python toujours nécessitent l'argument self
(je sais que cela ne doit pas nécessairement être self
, juste un mot-clé). Mais, cette classe que j'ai écrit ne l'exige pas:Pourquoi `self` n'est-il pas utilisé dans cette méthode?
import ZipFile
import os
class Zipper:
def make_archive(dir_to_zip):
zf = zipfile.ZipFile(dir_to_zip + '.zip', 'w')
for filename in files:
zf.write(os.path.join(dirname, filename))
zf.close()
Voir? No self
. Lorsque j'inclut un argument self
à make_archive
, j'obtiens une erreur TypeError: make_archive() missing one positional argument
. Dans ma recherche pour savoir pourquoi cela se passe, en fait je copiais et ai essayé d'exécuter un programme similaire de la documentation:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
print(MyClass.f()) # I added this statement to have a call line
et je reçois la même erreur!
TypeError: f() missing 1 required positional argument: 'self'
Dans le même module qui contient la classe Zipper()
, j'ai plusieurs classes qui utilisent tous self
. Je ne comprends pas la théorie ici, ce qui rend difficile de savoir quand faire quoi, d'autant plus qu'un programme copié directement à partir des docs (this is the docs page) a échoué quand je l'ai exécuté. J'utilise Python 3.5 et 3.4 sur Debian Linux. La seule chose que je peux penser est que c'est une méthode statique (et le Zipper.make_archive()
comme écrit ci-dessus fonctionne très bien si vous incluez @staticmethod
ci-dessus la méthode make_archive
), mais je ne peux pas trouver une bonne explication pour être sûr.
"Je ne comprends pas la théorie ici, ce qui rend difficile de savoir quand faire quoi, d'autant plus qu'un programme copié directement à partir de la docs (c'est la page docs) a échoué quand je l'ai exécuté." La partie qui a échoué n'est pas la partie que vous avez copiée des documents. L'extrait de code * très prochain * dans cette section illustre "l'instanciation" de la classe. Les deux prochaines sections couvrent les attributs (y compris les méthodes) de l'instance, etc. Vous ** devez ** lire ** et comprendre ** le texte entre les extraits de code, et pas seulement tester le code. –
En outre, votre terminologie est partout.Si vous essayez de vous apprendre la langue à partir de la documentation, sachez que cela peut être difficile. En tout cas, soyez plus prudent avec ceci; la programmation exige de la précision. StackOverflow n'est pas vraiment un endroit destiné à aider les gens à apprendre les bases d'une langue, et surtout pas "comment programmer"; C'est pour résoudre des problèmes techniques spécifiques qui se présentent dans votre travail. –
J'apprécie que StackOverflow est pour "des problèmes techniques spécifiques qui se posent dans votre travail". Personnellement, je considérerais cela comme un problème technique spécifique qui a surgi dans mon travail, étant donné que j'ai posé la question spécifique "Pourquoi cela ne nécessite-t-il pas l'argument 'soi'?" et je travaillais sur un projet personnel quand je suis tombé sur la question. J'ai fait des recherches approfondies avant de poser cette question, ce qui est nécessaire. Je n'ai aucune idée de ce que vous voulez dire sur ma terminologie, mais merci pour l'avertissement. Si vous avez un meilleur endroit pour poser des questions de programmation à 02h30, j'aimerais le faire ici. –