Je suis un débutant en python et j'essaie d'écrire un projet simple en utilisant la méthode OOP.

La première fonction attend que l'interface utilisateur saisisse le prénom de l'utilisateur.

La deuxième fonction attend que l'interface utilisateur saisisse le nom de l'utilisateur.

ENSUITE

La troisième fonction imprime le nom complet.

Mais

Lorsque j'ai essayé de lancer ces fonctions, cela me donne des erreurs.

Voici le code:

class UserFullName:
    def __init__(self, FirstName, LastName, FullName):
        self.FirstName = FirstName
        self.LastName = LastName
        self.FullName = FullName


    def FirstName(self):
        FirstName = input("enter your first name:\n".title())
        return FirstName

    def LastName(self):
        LastName = input("enter your last name:\n".title())
        return LastName

    def FullName(self, FirstName, LastName):
        print('welcome', "{} {}".format(FirstName, LastName).title())
        return

UserFullName.FirstName()
UserFullName.LastName()
UserFullName.FullName()

Voici l'erreur:

Traceback (dernier appel le plus récent):

Fichier "E: /Tutorial/pan.py", ligne 20, dans

UserFullName.FirstName()

TypeError: FirstName () manque 1 argument positionnel requis: 'self'

-3
Sayed Gouda 11 avril 2018 à 19:17

4 réponses

Meilleure réponse

Mon exemple utilise la fonction init qui sera exécutée tout le temps que vous initialisez la classe, si vous ne voulez pas l'utiliser, vous pouvez utiliser l'exemple suivant fourni par d'autres utilisateurs

Comme conseil pour la chaîne, je conseille d'utiliser raw_input, de toute façon, ce qui suit fonctionnera:

class UserFullName():
    def __init__(self):
        self.FirstName()
        self.LastName()
        self.FullName()

    def FirstName(self):
        self.FirstName = raw_input("enter your first name:\n")

    def LastName(self):
        self.LastName = raw_input("enter your last name:\n")

    def FullName(self):
        print("Welcome "+str(self.FirstName)+" "+str(self.LastName))

UserFullName()

Si vous voulez un retour dans les 2 premières méthodes, vous pouvez le faire même de cette autre manière:

class UserFullName():
    def __init__(self):
        name=self.FirstName()
        surname=self.LastName()
        self.FullName(name,surname)

    def FirstName(self):
        FirstName = raw_input("enter your first name:\n")
        return (FirstName)

    def LastName(self):
        LastName = raw_input("enter your last name:\n")
        return (LastName)

    def FullName(self, name, surname):
        print("Welcome "+str(name)+" "+str(surname))

UserFullName()
0
Carlo 1585 11 avril 2018 à 16:30

Si vous voulez faire cela de la façon OOP, vous voulez que l'état de votre objet - c'est-à-dire le prénom et le nom de l'utilisateur - fasse partie de l'objet. Comme ça:

def FirstName(self):
    self.FirstName = input("enter your first name:\n".title())
    return self.FirstName

def LastName(self):
    self.LastName = input("enter your last name:\n".title())
    return self.LastName

def FullName(self, FirstName, LastName):
    print('welcome', "{} {}".format(self.FirstName, self.LastName).title())
    return

Ce self.FirstName est un membre de l'objet, accessible à partir d'autres méthodes.


Mais vous devez également appeler ces méthodes sur un objet. Ce qui signifie que vous devez créer une instance de la classe:

user = UserFullName()
user.FirstName()
user.LastName()
user.FullName()

Sauf que cela ne fonctionnera pas non plus en raison de deux autres problèmes.

Tout d'abord, vos méthodes ont le même nom que vos attributs. Une fois que vous avez défini self.FirstName, vous ne pouvez plus jamais appeler la méthode FirstName, car vous l'avez masquée.

Deuxièmement, votre initialiseur vous oblige à saisir le prénom, le nom et le nom complet. Mais vous n'avez pas encore ces noms! Ils ne viennent que plus tard, lorsque vous appelez ces méthodes avec input. Il faudrait donc faire quelque chose comme user = UserFullName('', '', ''). Mais une meilleure solution consiste à supprimer complètement la méthode __init__, ou à réorganiser les choses pour que input se produise avant de créer la classe, et vous pouvez passer les noms au lieu de le faire à l'intérieur des méthodes.

2
abarnert 11 avril 2018 à 16:29

Si vous souhaitez utiliser une variable de classe, vous devez utiliser self pour la référencer et essayer de ne pas utiliser le même nom pour la variable et la méthode. btw vous devez créer une instance de classe à utiliser

  class UserFullName:
        def FirstName(self):
            self.firstName = input("enter your first name:\n".title())
            return self.firstName

        def LastName(self):
            self.lastName = input("enter your last name:\n".title())
            return self.lastName

        def FullName(self):
            print('welcome', "{} {}".format(self.firstName, self.lastName).title())



    userFullName = UserFullName()
    userFullName.FirstName()
    userFullName.LastName()
    userFullName.FullName()

    Enter Your First Name:
    1
    Enter Your Last Name:
    2
    ('welcome', '1 2')

Ou si vous préférez la méthode des cours

class UserFullName:
        @classmethod
        def FirstName(self):
            self.firstName = input("enter your first name:\n".title())
            return self.firstName
        @classmethod
        def LastName(self):
            self.lastName = input("enter your last name:\n".title())
            return self.lastName
        @classmethod
        def FullName(self):
            print('welcome', "{} {}".format(self.firstName, self.lastName).title())

UserFullName.FirstName()
UserFullName.LastName()
UserFullName.FullName()

Enter Your First Name:
1
Enter Your Last Name:
2
('welcome', '1 2')
-2
galaxyan 11 avril 2018 à 16:28

Vous avez appelé UserFullName mais ne l'avez pas insatié en lui donnant les arguments fournis dans la fonction __init__. Essayez plutôt quelque chose comme UserFullName(FirstName='James', LastName='Sull', FullName='James Sull').FirstName().

-1
galfisher 11 avril 2018 à 16:21