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

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    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
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    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 : 488
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
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    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.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    Citation Envoyé par deusyss Voir le message
    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.
    c'est une essai
    j'ai essayé avec parenthèse mais cela attend un argument self , si je met self il n'est pas reconnu dans la class ( porté globale)
    TypeError: ChronoTime() missing 1 required positional argument: 'self'

    avec self en tout logique
    __chrono=ChronoTime(self)
    NameError: name 'self' is not defined

    si je fait

    __Chrono=property (ChronoTime)
    je n'arrive à pas acceder dans la classe au element de __Chrono

    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 50, in UnifyDateStamp
    MyChrono=__chrono[0]
    TypeError: 'function' object is not subscriptable
    >>>

    je tourne en rond...

  9. #9
    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
    Ce code fonctionne chez moi

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import time
    import datetime
     
    class UnifyDateStamp(object):
     
    	def __init__(self,tz) :
    		__doc__='test de documentation'
     
    		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()
    		__chrono = self.ChronoTime()
     
    		MyChrono=__chrono[0]
    		MyChronoIso=__chrono[1]
    		Chrono=property(MyChrono)
    		ChronoIso=property(MyChronoIso)
     
     
     
     
    	def ChronoTime(self) :
    		ChronoTimeSrvNow=self.Chrontime
    		ChronoTimeSrv=datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
    		return (ChronoTimeSrvNow ,ChronoTimeSrv)
     
     
     
     
    	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)
     
     
     
     
     
    if __name__ == "__main__":
    	data=UnifyDateStamp(False)
    	print (data.time)
    J'ai déplacé ton code en rougeet remanié une ligne d'appel. Cela correspond à ce que tu cherchais?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    le code fonctionne avec le time certe mais pas avec Chrono
    en deplaçant dans le def __ini__ , cela produit une erreur

    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 75, in <module>
    print(data.Chrono)
    AttributeError: 'UnifyDateStamp' object has no attribute 'Chrono'

    en effet la Chrono est inconnu dans la section __ini__ , et déclarer plus loin en dehors de la fonction

    edit

    si je code Chrono=property(ChronTime)


    et accede par print (data.Chrono[1] ) ca me retourne un resultat correct >>> 1970-01-01T00:10:02.189942 ( a part que windows deconne avec la clok )^^

    mais je veut justement eviter d'avoir des index à consulter d'où la necessité d'avoir des attributs et l'objet sortie par cette méthode est bien un tuplet que j'aimerai "spliter" dans la classe si c'est possible

  11. #11
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Il faudra que tu postes ton code réel parce que la reconstruction de deusyss présente manifestement des incohérences d'indentation.

    Ceci est incompréhensible par ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    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) :
    Non seulement l'indentation semble érronée mais en plus le code n'a aucun sens.


    Une question, quelle est l'utilité des property que tu déclares dans ton code, quelle est ton intention ?


    Et encore une chose, le double underscore qui précède un nom a une utilité en Python, il privatise le nom.
    Autrement dit, il t'interdit d'y accéder de l'extérieur de la classe.
    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
     
    >>> class Foo(object):
    ...     def __init__(self):
    ...             pass
    ...     def baz(self):
    ...             return 42
    ...     __baz = baz
    ...     ham = baz
    ... 
    >>> foo = Foo()
    >>> print foo.baz()
    42
    >>> print foo.ham()
    42
    >>> print foo.__baz()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Foo' object has no attribute '__baz'
    >>>

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    Je veux que ma classe retourne des attributs que retournait la fonction source via le tuplet (UniFullSDate , UniDate , UniTime , ChronoTimeSrvNow )

    le double under score est voulu car je ne souhaite pas que des objets intermédiaires soit utilisable en dehors de celle ci

    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
    39
     
    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)
    	# section posant probleme
    	__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)
    		#Date=(self.UniDate , self.UniFullDate , self.UniFullStringDate)
    		return (UniDate , UniFullDate , UniFullStringDate)
    le problème se pose sur la mise en place de property lorsque l'objet que retourne la fonction interne à la classe renvoi un tuplet , je n'arrive pas à isoler chaque élément du tuplet pour en faire un attribut
    le seul truc que j'arrive à sortir en dehors de la classe comme mentionner plus haut est un tuplet et ça me convient pas car justement l'objet de transformation de la fonction source initial est de se débarrasser de l'indexage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	Chrono=property(chronoTime)
    place un tuplet en propriété dont je n'arrive à pas à accéder dans la classe et à séparer les elements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	time=property(Time)
    me permet d'acceder à l'objet time en dehors de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         data=UnifyDateStamp(False) #parametre pour la time zone
         print(data.time)
    revoit l'heure avec ou sans tz
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         data=UnifyDateStamp(False) #parametre pour la time zone
         print(data.Chrono)
    renvoi un tuplet ou une erreur dans le code que j'ai linké

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         data=UnifyDateStamp(False) #parametre pour la time zone
         print(data.Chrono[1])
    me renvoi la premiere valeur du tuplet mais l'utilisation de la classe est fait pour se debarraser d'appel via index : mon cahier des charges)

  13. #13
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Désolé mais ton code est une succession d'incohérences.

    Ligne par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	__chrono=ChronoTime
    	MyChrono=__chrono[0]
    	MyChronoIso=__chrono[1]
    "__chrono" est un alias de ChronoTime qui n'est pas appellée, si tu voulais que __chrono contienne le retour de ChronoTime() il fallait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	__chrono=ChronoTime()
    Et ensuite on trouve ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	Chrono=property(MyChrono)
    	ChronoIso=property(MyChronoIso)
    Qui ne servent manifestement à rien. Si tu voulais créer des attributs d'instance il suffisait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	def ChronoTime(self) :
    		self.Chrono = self.Chrontime
    		self.ChronoIso = datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
    Quoique self.Chrontime est time.clock(), c'est-à-dire une information instable ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	def DataTime(self) :
    		__Date=self.datenow.replace(microsecond=0)
    		return __Date
    	__DateNow=property(DataTime)
    Quelle différence avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	def DataTime(self):
                return self.datenow.replace(microsecond=0)
    ?

    Ensuite on ne comprend plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	def Time(DataTime) :
    Pas de self ? et qu'est-ce que fout DataTime comme argument de cette fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		UniTime=str(datetime.datetime.strftime(DataTime.__DateNow, '%H:%M:%S'))
    		return UniTime
    	time=property(Time)
    DataTime.__DateNow Peux-tu expliquer ceci ?

    Même remarques dans la fonction qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	def Date(DataTime) :
    		UniDate=str(datetime.datetime.strftime(DataTime.__DateNow, '%d/%m/%y'))
    		UniFullDate=datetime.datetime.isoformat(DataTime.__DateNow)
    		UniFullStringDate=str(self.UniFullDate)
    		#Date=(self.UniDate , self.UniFullDate , self.UniFullStringDate)
    		return (UniDate , UniFullDate , UniFullStringDate)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    Ligne par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	__chrono=ChronoTime
    	MyChrono=__chrono[0]
    	MyChronoIso=__chrono[1]
    "__chrono" est un alias de ChronoTime qui n'est pas appellée, si tu voulais que __chrono contienne le retour de ChronoTime() il fallait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	__chrono=ChronoTime()
    si je rajoute les parenthèse cela sort une erreur comme mentionné plus haut

    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 50, in UnifyDateStamp
    __chrono=ChronoTime()
    TypeError: ChronoTime() missing 1 required positional argument: 'self

    Qui ne servent manifestement à rien. Si tu voulais créer des attributs d'instance il suffisait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	def ChronoTime(self) :
    		self.Chrono = self.Chrontime
    		self.ChronoIso = datetime.datetime.isoformat(datetime.datetime.utcfromtimestamp(ChronoTimeSrvNow))
    Quoique self.Chrontime est time.clock(), c'est-à-dire une information instable ...
    ne resoud pas mon problème d'acces aux objet de la fonction
    et me retourne un
    File "G:\ZZZZ_Projet\Projet Python\SoftManifest\test\_ChronoDate.py", line 50, in UnifyDateStamp
    print (ChronoTime.ChronoTimeSrvNow)
    AttributeError: 'function' object has no attribute 'ChronoTimeSrvNow'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	def DataTime(self) :
    		__Date=self.datenow.replace(microsecond=0)
    		return __Date
    	__DateNow=property(DataTime)
    Quelle différence avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	def DataTime(self):
                return self.datenow.replace(microsecond=0)
    ?
    aucune différence c'est juste que j'ai des reflexes VBS ... (sic)

    Ensuite on ne comprend plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	def Time(DataTime) :
    Pas de self ? et qu'est-ce que fout DataTime comme argument de cette fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		UniTime=str(datetime.datetime.strftime(DataTime.__DateNow, '%H:%M:%S'))
    		return UniTime
    	time=property(Time)
    DataTime.__DateNow Peux-tu expliquer ceci ?
    l'idée de la fonction derivé est d’éviter de réécrire l'instruction plusieurs fois dans le code; bon là effectivement c'est peu être un peu lourds

    j'ai articuler le code autour de paramètre entrant volatile que je fixe une première fois dans le def__ini__
    j'ai besoin dans un cas de disposer des microseconde pour le chrono time et dans d'autre ( affichage de date et heure standard il faut le faire sauter ) ,mon soucis ce n'est pas la structure, en plus c'est une version alpha en cours de débogage mais cruciale pour moi dans la compréhension de récupération de paramètre de fonction d'une classe car je dois dev d'autre classe plus complexe.
    c'est pour cela que j'avais pas link le code des le départ pour se concentrer sur l'essentiel :comment récupérer les valeurs ( tuplet) d'une fonction d'une classe et les affecter en propriété accessible individuellement

  15. #15
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Tu confonds property et attributs.

    Ce dont tu as besoin, si je te suis bien, c'est simplement d'accéder aux attributs de ta classe individuellement.

    Dans ce cas, pourquoi ceci ne convient pas:
    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
     
    import time
    from datetime import datetime
     
    class UnifyDateStamp(object):
        def __init__(self, tz):
            self.tz = tz
            self.set_datetime_values()
     
        def reset(self):
            self.set_datetime_values()
     
        def set_datetime_values(self):
            if self.tz:
                self.datenow = datetime.utcnow()
     
            else:
                self.datenow = datetime.now(tz=None)
     
            self.chrono = time.clock()
            self.isochrono = datetime.isoformat(datetime.utcfromtimestamp(self.chrono))
            dn = self.datenow.replace(microsecond=0)
            self.unitime = datetime.strftime(dn, '%H:%M:%S')
            self.unidate = datetime.strftime(dn, '%d/%m/%y')
            self.unifulldate = datetime.isoformat(dn)
     
     
    udf = UnifyDateStamp(False)
    print('datenow: %s\nchrono: %s\nisochrono: %s\nunitime: %s\nunidate: %s\nunifulldate: %s' 
            %(udf.datenow, udf.chrono, udf.isochrono, udf.unitime, udf.unidate, udf.unifulldate))
    udf.reset()
    print('------------------------------------------')
    print('datenow: %s\nchrono: %s\nisochrono: %s\nunitime: %s\nunidate: %s\nunifulldate: %s' 
            %(udf.datenow, udf.chrono, udf.isochrono, udf.unitime, udf.unidate, udf.unifulldate))
    print('------------------------------------------')
    udf = UnifyDateStamp(True)
    print('datenow: %s\nchrono: %s\nisochrono: %s\nunitime: %s\nunidate: %s\nunifulldate: %s' 
            %(udf.datenow, udf.chrono, udf.isochrono, udf.unitime, udf.unidate, udf.unifulldate))

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Par défaut
    effectivement là c'est plus simple ton code est linéaire , dans mon code les attributs n'exitent que si la propriété de la fonction est appelé vu qu'il n'y à pas d'appel des fonctions dans __ini__ , je viens de m'en apercevoir .
    les objet des def ne sont pas rendu accessible , les résultats uniquement public via la property

    le contournement que tu m'a link permet de s'affranchir d'une partie du problème , reste plus qu'a masquer certain élément comme dn en __dn pour obtenir la même chose , cependant cela m'explique toujours pas si il est possible de fixer une attribut via property à chaque élément du tuple, je me pose la question de l'imbrication d'une Class dérivé pour contourner histoire de pousser les tests à fond.

    je te remercie pour l'eclairage sur le sujet des class que tu m'a apporté

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