0
votes

Créer un objet de classe dans une autre classe

J'essaie de créer un objet de classe des informations d'identification et d'exécuter la méthode get_username_password dans l'objet de la classe session : xxx

Si je le fais avec B , b.Credentials est un objet type objet.


4 commentaires

Pourquoi remplacez-vous immédiatement les informations d'identification que vous avez attribuées à auto.Credentials avec la valeur renvoyée à partir de son get_username_password méthode (qui est en effet Aucun , comme cette méthode ne renvoie rien)?


Pour a , a.cripticides = informations d'identification () résultats dans A.Asername = Aucune etc., que a.get_username_password Ensembles A.Username == INPUT_STR . Cela fonctionne bien. Pour B il ne fonctionne pas. Je m'attendrais également à B.Credentials.Username == INPUT_STR , mais comme je l'ai écrit ci-dessus, `B.Credentials 'est un objet de type" Aucun ".


Veuillez relire le commentaire ci-dessus: vous attribuez auto -.crédentials au résultat de get_username_password () , qui est Aucun , comme cette méthode ne rien retourner. Vous avez juste à appeler automedentials.get_username_password () .


Oui. Vous avez raison. Si je remplace self.credentials = self.credentials.get_username_password () avec juste self.credentials.get_username_password () Je reçois ce que je voulais. Merci. Pourriez-vous expliquer le contexte avec le @ClassMethod?


4 Réponses :


0
votes

Je pense que vous recherchez:

class Credentials:
    def __init__(
            self,
            username=None,
            password=None,
            client_id=None,
            client_secret=None):

        self.username = username
        self.password = password
        self.client_id = client_id
        self.client_secret = client_secret

    def get_username_password(self):
        self.username = input("please enter your username: ")
        self.password = input("please enter your password: ")

class Session:
    def __init__(
            self):
        self.credentials = Credentials()

    def get_username_password(self):
        self.credentials.get_username_password()


1 commentaires

Désolé, mais cela ne fonctionne pas pour moi. Par conséquent, je reçois la méthode get_username_password direct sous B et aussi sous b.Credentials .



0
votes

get_username_password est plus logique en tant que méthode de classe qui invite l'utilisateur pour les données, puis transmet les résultats à __ init __ comme indispensables arguments. < Pré> xxx

Il est discutable s'il devrait s'agir d'un membre de des informations d'identification du tout, car ce n'est pas quelque chose que vous devez appeler de session .__ init __ non plus. xxx

en règle générale, gardez E / S de __ init __ autant que possible.


0 commentaires

0
votes

salut là steffen. J'espère que vous allez bien.

Le creux de votre problème est que vous instanciez deux références distinctes objets. Vous instaniez A sous forme d'informations objet, puis vous instaniez un SPAR ( Code> objet dans la session objet.

Il y a quelques solutions à ce problème que je suis au courant.



1. Passez l'objet de références dans l'objet de session comme argument d'initialisation.


xxx

2. Créez une classe Singleton Out of ** Critiques . Cela signifierait que vous n'avez qu'un seul objet qui représente la classe dans son ensemble. En d'autres termes, où vous l'instanciez, vous aurez accès à la même instance de Critiques Propriétés. Voici un Tutoriel Si vous souhaitez examiner plus loin. Je ne pense pas que c'est ce que vous essayez de réaliser cependant. **


3. Il peut y avoir d'autres options aussi. Je ne suis pas versé dans toutes les méthodes.



J'espère que cela vous aide! Bonne chance!


0 commentaires

0
votes

self.credentials = self.credentials.get_username_password () code> Le problème ici est que self.credentials code> est un objet et que vous appelez la méthode get_username_password code> sur cet objet, mais cette méthode ne renvoie rien de sorte qu'il n'y a rien qui passe dans b .Credentials code> et cela devient donc un objet Aucun code> objet.

Vous pouvez essayer quelque chose comme ça. p>

class Credentials:
    def __init__(
            self,
            username=None,
            password=None,
            client_id=None,
            client_secret=None):

        self.username = username
        self.password = password
        self.client_id = client_id
        self.client_secret = client_secret

    def get_username_password(self):
        self.username = input("please enter your username: ")
        self.password = input("please enter your password: ")

class Session:
    def __init__(
            self):

        self.credentials = Credentials()
        # self.credentials = self.credentials.get_username_password()

if __name__ == "__main__":
    a = Credentials()
    a.get_username_password() 
    b = Session()
    b.credentials.get_username_password()


0 commentaires