2017-06-01 5 views
0

J'apprends python par moi-même. En ce moment j'essaye de coder un carnet d'adresses. J'ai lu que vous devriez utiliser une classe pour cela et je ne comprends pas pourquoi parce que vous pouvez définir toutes les fonctions que vous avez dans cette classe (comme insertaddress, deletaddres, ...) sans un et l'utiliser comme des fonctions normales. Ou ai-je tort?Importer ma classe et l'utiliser me donne une erreur

Mais pour obtenir un peu de pratique avec des classes i créé un:

class Addressbook(): 

    def __init__(self,last,first,street,num,plz,place): 

     self.last=last 
     self.first=first 
     self.street=street 
     self.num=num 
     self.plz=plz 
     self.place=place 

    def insertadd(self): 
     text =self.last+" "+self.first+" "+self.street+"  
     "+self.num+" "+self.plz+" "+self.place+"\n" 
     with open("addressbook.txt", "a") as file: 
      file.write(text) 

Dans mon principal fichier:

from klassen import Addressbook 

k.last= input() 
k.first=input() 
(...) 
k.place = input() 

k.insertadd() 

Mais quand j'importer ma classe via from klassen import Addressbook as k et le lien entre les attributs de classe à mon entrée: k.first=input("text") et essayez d'exécuter la fonction k.insertadd() je reçois un message d'erreur.

NameError: name 'self' is not defined 

Quand je donne ma fonction à chaque paramter j'ai comme entrée je reçois une erreur qui me dit que « lieu » est un paramter manquant.

Pourriez-vous s'il vous plaît aide-moi?

+1

Bienvenue sur StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

+2

Vous semblez avoir quelques malentendus sur le fonctionnement des classes. Il semble que vous essayez d'utiliser directement l'objet de classe pour stocker vos données. Ne fais pas ça. Vous devez créer une ou plusieurs instances de la classe. Et pour le moment, oubliez d'importer la classe Addressbook. Essayez de commencer par travailler dans un seul fichier de script. Une fois que tout fonctionne, vous pouvez le diviser en plusieurs fichiers, mais il n'y a probablement pas besoin de le faire, Python n'est pas Java. –

+0

Mes codes d'amis en C++ et il m'a dit que je pourrais structurer mon code plus en créant des fichiers supplémentaires pour les classes et les fonctions. pour que ma main soit meilleure à lire. Voulez-vous dire pas de fichiers multiples pour les petits projets ou en général'? – Omikron

Répondre

0

Vous devriez faire:

from klassen import Addressbook 
k = Addressbook("","","","","","") # Init it with the variables you want! 

Ensuite, vous pouvez utiliser k comme un objet ...

La façon dont vous faisiez, vous ne créez pas une instance d'un objet Addressbook, que vous utilisiez l'objet de classe lui-même ...

0

Il est généralement accepté d'utiliser une classe lorsqu'un certain ensemble de fonctions doit être encapsulé ensemble ou que la fonctionnalité doit être abstraite. Imaginez que votre "carnet d'adresses" contienne un ensemble de fonctions utilisées par différentes applications. Par exemple, par un "annuaire", "application de messagerie" et ainsi de suite. En séparant chacun d'entre eux en tant que classe, vous avez un meilleur contrôle sur le code et les ressources associées, avec moins de redondance. Par conséquent, la maintenabilité s'améliore.

Pour votre code, vous devez initialiser toutes les variables. Ou au moins transmettez-les à votre fonction init.

de Carnet d'adresses d'importation klassen

k = Carnet d'adresses ("bar", "toto", "15 rue XYZ", 1234444212, "ABC", "New York")

k.insertadd()

Ou l'autre façon de le gérer est d'initialiser dans la fonction init pour accepter le paramètre "Aucun" par défaut.

Ex: classe AddressBook():

def __init__(self,last,first,street = None,num,plz = None,place = None): 

    self.last=last 
    self.first=first 
    self.street=street 
    self.num=num 
    self.plz=plz 
    self.place=place 

Maintenant, l'objet aurait pas besoin de tous les paramètres.

d'import klassen Carnet d'adresses

k = Carnet d'adresses (last = "bar", first = "toto", num = 1234444212)

k.insertadd()