IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Classe : recuperer des attribut multiple dans une fonction de classe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2010
    Messages : 59
    Par défaut Classe : recuperer des attribut multiple dans une fonction de classe
    je rencontre un problème lors de la création d'une classe python ( ma premiere classe , je monte en compétence sur ce langage ) ;

    je voudrait eviter de devoir acceder à un attrib du class via un indexage comme le fait ma fonction initial

    j’essaie de convertir une fonction ( qui fonctionne ) que j'ai crée en classe la classe dispose de plusieurs fonctions
    et je n'arrive pas à fixer une propriété aux fonctions qui retourne un tuplet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	def a(self) :
    		item1= 'test1'
    		item2=' test2'
    		return (item1 ,item2)
    	__attrib=property(a)
    je souhaiterai fixer 2 attribut que retourne la fonction à la classe mais toute mes tentatives d'acces me retourne un

    TypeError: 'property' object is not subscriptable quand je tente d'acceder à attrib1=____attrib[0]

    ou un
    TypeError: 'function' object is not subscriptable quand je tente d'acceder à attrib1=a[0]

    ou attrib =a() me renvoie self manquant et si je le rajoute self ca me sort self non definit ..

    il y a un truc qui m’échappe même après lecture de la doc et des forum sur les class , classmethod

  2. #2
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Salut,

    je vois que tu es nouveau sur le forum. Pour poster du code, il faut utiliser la balise # dans l'outil de post.

    Pourrais tu nous poster, avec la balise, ton code? Il nous faudrait le code tel qu'il était dans ton fichier initial (en tant que fonction) et le code en tant que classe.

    On pourra ainsi mieux t'aider.

    Juste au cas ou, je vais évoquer le cas du self, de façon assez imagé. Une classe, c'est un peu un moule. Au sein de ce moule, tu as deux façon de déclarer et utiliser des variables. Solution 1, la variable est lié au moule, à la classe. Tu définis simplement tes variables comme dans une fonction. Solution 2, la variable est lié à l'objet. Dans ce cas tu dois utiliser "self.<variable>. Le self permet d'indiquer que tu vise la variable spécifique à l'objet et non la variable de la classe.

    On attend ton retour pour t'aider mieux.

  3. #3
    Membre averti
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2010
    Messages : 59
    Par défaut
    bien je voulais eviter de noyer le problème dans le code en faisant sortir la partie qui me pose problème

    code initial source pour du chronodatage de log

    #def UniversalDateStamp(): #Genere la date au format
    # ChronoTimeSrvNow=time.clock()
    # DateNow=datetime.datetime.utcnow() # DateNow=datetime.datetime.now(tz=None)
    # UniDate=str(datetime.datetime.strftime(DateNow, '%d/%m/%y'))
    # UniTime=str(datetime.datetime.strftime(DateNow, '%H:%M:%S'))
    # DateNow=DateNow.replace(microsecond=0)
    # UniFullDate=datetime.datetime.isoformat(DateNow)
    # UniFullSDate=str(UniFullDate)
    # ChronotimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
    # return(UniFullSDate , UniDate , UniTime , ChronoTimeSrvNow)

    ce code fonctionne mais je dois acceder via indexage et je le change comme suit
    Nom : mycode.jpg
Affichages : 492
Taille : 117,8 Ko

    # __chrono=ChronoTime
    # MyChrono=__chrono[0]
    # MyChronoIso=__chrono[1]
    # Chrono=property(MyChrono)
    # ChronoIso=property(MyChronoIso)
    #




    la partie rouge est la ou je coince et fait pas mal d'essai , le dernier def je le toucherai quand j'aurai une solution

    l'appelle de la fonction dans le code tierce

    udate=UniversalDateStamp()
    print (udate.time ) fonctionne correctement
    mais un print (udate.Chrono ) jette une erreur mentionné plus haut ,

  4. #4
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Merci beaucoup.

    Par balise, j'entendais le bouton #. Ton code doit alors etre entouré de [ CODE ] et de [ /CODE ]. (supprimer les espaces entre les [ ] et CODE)

    Mais ce n'est pas grave, je repose ton code ci dessous, tel que je penses qu'il est. Sinon merci de corriger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def UniversalDateStamp(): #Genere la date au format
        ChronoTimeSrvNow=time.clock()
        DateNow=datetime.datetime.utcnow() # DateNow=datetime.datetime.now(tz=None)
        UniDate=str(datetime.datetime.strftime(DateNow, '%d/%m/%y'))
        UniTime=str(datetime.datetime.strftime(DateNow, '%H:%M:%S'))
        DateNow=DateNow.replace(microsecond=0)
        UniFullDate=datetime.datetime.isoformat(DateNow)
        UniFullSDate=str(UniFullDate)
        ChronotimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
        return(UniFullSDate , UniDate , UniTime , ChronoTimeSrvNow)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class UnifyDateStamp(object):
        __doc__='test de documentation'
        def __init__(self,tz) :
            if (tz=='none' or tz==False) :
                self.datenow=datetime.datetime.now(tz=None)
            elif (tz=='' or tz==True ):
                self.datenow=datetime.datetime.utcnow()
            else :
                raise( AttributeError , "Attribut inconnu :"+tz)
            self.Chrontime=time.clock()
     
        def ChronoTime(self) :
            ChronoTimeSrvNow=self.Chrontime
            ChronoTimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
            return (ChronoTimeSrvNow ,ChronoTimeSrv)
     
            __chrono=ChronoTime
     
            MyChrono=__chrono[0]
            MyChronoIso=__chrono[1]
            Chrono=property(MyChrono)
            ChronoIso=property(MyChronoIso)
     
        def DataTime(self) :
            __Date=self.datenow.replace(microsecond=0)
            return __Date
            __DateNow=property(DataTime)
     
        def Time(DataTime) :
            UniTime=str(datetime.datetime.strftime(DataTime.__DateNow, '%H:%M:%S'))
            return UniTime
        time=property(Time)
     
        def Date(DataTime) :
            UniDate=str(datetime.datetime.strftime(DataTime.__DateNow, '%d/%m/%y'))
            UniFullDate=datetime.datetime.isoformat(DataTime.__DateNow)
            UniFullStringDate=str(self.UniFullDate)
            return (UniDate , UniFullDate , UniFullStringDate)

    SI tel que je l'ai mis ici cela est correct, quelque chose me choque: les return dans les def ne sont pas en dernier. TU as des instructions derrière. Cela va te poser probleme.

  5. #5
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Je viens de voir que tu as modifié ton post avant que je mette ma reponse ci dessus.

    Dans ton code, ajoute à la toute fin un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if __name__ == "__main__":
    Cela te permettra de mettre un petit test unitaire ou tu pourra créer un objet et appeler tes methodes et faire un print du resultat. Ainsi simplement en lançant le fichier tu saura si cela fonctionne ou non.

    EDIT: dans ton code, le code en rouge appartient à la classe mais pas à une fonction en particulier. Cela ne me semble pas correct. Tu ne peut pas mettre de code en dehors des fonctions dans une classe, a ma connaissance. TOn code doit etre inclus dans une fonction/procedure. Tout le code qui te pose probleme etant dans ce cas, je pense que ton anomalie se trouve là.

    Essaie de odifier ton code et de faire des tests pour voir.

  6. #6
    Membre averti
    Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2010
    Messages : 59
    Par défaut
    Citation Envoyé par deusyss Voir le message
    Merci beaucoup.

    Par balise, j'entendais le bouton #. Ton code doit alors etre entouré de [ CODE ] et de [ /CODE ]. (supprimer les espaces entre les [ ] et CODE)

    Mais ce n'est pas grave, je repose ton code ci dessous, tel que je penses qu'il est. Sinon merci de corriger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def UniversalDateStamp(): #Genere la date au format
        ChronoTimeSrvNow=time.clock()
        DateNow=datetime.datetime.utcnow() # DateNow=datetime.datetime.now(tz=None)
        UniDate=str(datetime.datetime.strftime(DateNow, '%d/%m/%y'))
        UniTime=str(datetime.datetime.strftime(DateNow, '%H:%M:%S'))
        DateNow=DateNow.replace(microsecond=0)
        UniFullDate=datetime.datetime.isoformat(DateNow)
        UniFullSDate=str(UniFullDate)
        ChronotimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
        return(UniFullSDate , UniDate , UniTime , ChronoTimeSrvNow)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class UnifyDateStamp(object):
        __doc__='test de documentation'
        def __init__(self,tz) :
            if (tz=='none' or tz==False) :
                self.datenow=datetime.datetime.now(tz=None)
            elif (tz=='' or tz==True ):
                self.datenow=datetime.datetime.utcnow()
            else :
                raise( AttributeError , "Attribut inconnu :"+tz)
            self.Chrontime=time.clock()
     
        def ChronoTime(self) :
            ChronoTimeSrvNow=self.Chrontime
            ChronoTimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
            return (ChronoTimeSrvNow ,ChronoTimeSrv)
     
         __chrono=ChronoTime
     
         MyChrono=__chrono[0]
         MyChronoIso=__chrono[1]
         Chrono=property(MyChrono)
         ChronoIso=property(MyChronoIso)
     
        def DataTime(self) :
            __Date=self.datenow.replace(microsecond=0)
            return __Date
         __DateNow=property(DataTime)
     
        def Time(DataTime) :
            UniTime=str(datetime.datetime.strftime(DataTime.__DateNow, '%H:%M:%S'))
            return UniTime
        time=property(Time)
     
        def Date(DataTime) :
            UniDate=str(datetime.datetime.strftime(DataTime.__DateNow, '%d/%m/%y'))
            UniFullDate=datetime.datetime.isoformat(DataTime.__DateNow)
            UniFullStringDate=str(self.UniFullDate)
            return (UniDate , UniFullDate , UniFullStringDate)

    SI tel que je l'ai mis ici cela est correct, quelque chose me choque: les return dans les def ne sont pas en dernier. TU as des instructions derrière. Cela va te poser probleme.
    l'indentation n'etait pas correcterement reporté , pour le test unitaire j'appelle à l'aide d'un externe qui doit utiliser cette classe
    le retour me donne
    File "C:\Python33\Lib\SITE-P~1\PYTHON~2\pywin\framework\scriptutils.py", line 326, in RunScript
    exec(codeObject, __main__.__dict__)
    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 35, in <module>
    class UnifyDateStamp(object):
    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 50, in UnifyDateStamp
    MyChrono=__chrono[0]
    TypeError: 'function' object is not subscriptable

    y at il un moyen pour fixer des attribut (propriété) multiple à une fonction de classe ?

  7. #7
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Alors si je me fie au code que tu as donné en image, tu écrits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __chrono = ChronoTime[1]
    A quoi correspond ton ChronoTime? Au debut je pensais que c'était ta fonction, mais elle ne prend pas d'arguments. De plus, tu aurais utilisé des parenthèses et non des crochets.

Discussions similaires

  1. Paramètres multiples dans une fonction
    Par MicaelFelix dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/02/2008, 17h06
  2. Généricité des Input Arguments dans une fonction
    Par RaphTIM dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/06/2007, 16h28
  3. [C++ STL] rediriger un signal dans une fonction de class
    Par tux84000 dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/05/2007, 18h28
  4. Réponses: 7
    Dernier message: 24/01/2007, 10h01
  5. Recuperation des objet ole dans une base SQL
    Par TOPGUN89 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 25/11/2005, 09h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo