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 :

appel d'une fonction de classe par chaine de caractere ou objet


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 appel d'une fonction de classe par chaine de caractere ou objet
    Suite à une réorganisation de classe dans mon programme je rencontre un problème d'appel à fonction
    mon programme initial est composer de type de 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
    class A ( object)
    	def init ( self)class B 
    		def __init__ (self)
    		….
    		def func_1 (cls, arg )
    			..
    			_Control=cls._A__func2__(Arg1)
    			….
    		def func_2 (cls,_Control)
    			…
    			_ClsListRoot=str(__class__).split('\'',2)
    			_ClsRoot=_ClsListRoot[1].lstrip('__main__.')
    			_ClsObj='_'+cls.__class__.__name__
    			_ArgCmdType=_ClsObj+_FuncCmd
    			_ArgCmd=_ClsRoot+'.'+_ArgCmdType
    			_KsState=getattr(cls,_ArgCmdType)(_ VarOther)
    cela fonctionne correctement dans ce cas de figure
    (objet cls défini dans l'appel à un wrapper associé à la fonction que je n'ai pas décris ici )

    j'ai réorganisé en classe séparée

    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
    class A ( object)
    	def init ( self)class B 
    		def __init__ (self)
    		….
    		def func_1 (cls, arg )
    			..
    			_Control=cls._A__func2__(Arg1)
    	class C 
    		def __init__ (self)
    			….
    		def func_2 (cls,_Control)
    			…
    			_ClsListRoot=str(__class__).split('\'',2)
    			_ClsRoot=_ClsListRoot[1].lstrip('__main__.')
    			_ClsObj='_'+cls.__class__.__name__
    			_ArgCmdType=_ClsObj+_FuncCmd
    			_ArgCmd=_ClsRoot+'.'+_ArgCmdType
    			_KsState=getattr(cls,_ArgCmdType)(_ VarOther)

    L'objet cls est défini pour dans l'appel d'un décorateur de chaque fonction cependant dans la func_2 l'objet cls fait référence à la classe _main__.A.B object ce qui engendre une erreur :
    _KsState=getattr(cls,_ArgCmdType)(_ClsRoot,_KsState[1])
    AttributeError: 'B' object has no attribute '_C__resultatdeFuncCmd'
    comme je ne souhaite pas inscrire en dure l'appel dans le code pour de la portabilité j'ai tenté de remplacer cls par _ClsRoot ou même par _class__.__name__ mais cela me sort une erreur :

    AttributeError: 'str' object has no attribute '_C__resultatdeFuncCmd'
    bref y a-t-il in moyen de faire un appel indirect d'une classe en utilisant une chaîne de caractère ou d'obtenir un objet exploitable représentant le chemin de la fonction de la classe vu que l'appel interclasse n’exécute pas la fonction __ init__ de la classe C et empêche de initialiser self ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Avec Python, self et cls sont des noms de variables "prédéfinis" par l'usage.

    bref y a-t-il in moyen de faire un appel indirect d'une classe en utilisant une chaîne de caractère ou d'obtenir un objet exploitable représentant le chemin de la fonction de la classe vu que l'appel interclasse n’exécute pas la fonction__ init__ de la classe C et empêche de initialiser self ?
    C'est quoi une fonction de la classe? Une méthode? Une méthode de classe? Une simple fonction?
    Si elle accepte comme premier argument autre chose que "self", ce n'est pas une méthode et pas besoin de passer par "__init__'" (supposé initialiser les attributs d'une nouvelle instance dans "self").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  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
    j'ai tenté de remplacer cls par self et cela n'a aucun effet sur l'initialisation et sur l'erreur dût visiblement au passage de paramètre lors de l'appel , vu que j'ai besoin de passer un paramètre , je suis en plein brouillard c'est pourquoi j’essaie un contournement

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Le problème est que vous n'exposez pas le pourquoi de votre code, vous montrez juste un bout de votre solution sans permettre de reproduire quoi que ce soit.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    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
    Peu importe l'objet du programme globale il utilise un système de libraire de fonction de base regrouper dans une classe qui servent à effectuer des tests complexe pour ce faire à l'aide d'un métalangage que j'ai créé. La fonction qui me pose problème reçoit et transforme un paramètre en nom de fonction de base à appeler . il y a 2 controles amont par 2 autres fonction placer en decorateur sur celle qui me pose problème que je n'ai pas décris .
    j'ai essayer de rendre générique pour que cela soit reproductible . il suffit de faire une fonction de test exemple _Test pour tester en mode "bouchon" et d'attribuer _FuncCmd='__Test'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def _Test (MyArg):
    	__doc__='Test'
    	print(__doc__)
    mon problème fondamentale avec le changement de structure de classe est le passage de paramètre et le moyen d'utiliser si possible la fonction gettattrb ( object , string) ( ) en utilisant un pointeur sur l'objet


    getattr(object, name[, default])
    Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.

  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
    Pour tester la structure de mon programme voici exemple qui la reproduit


    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #!/usr/local/bin/python3.6
    # -*- coding: latin-1 -*-
    from functools import wraps
    import collections
    class A ( object):
    	def __init__ ( self):
    		__doc__='--init classe A--'
    		print(__doc__)
    		self.GlobeVarA='varA'
     
    	#
    	class B ( object):
    		def __init__ (self):
    			__doc__='--init classe B--'
    			print(__doc__)
    			self.GlobeVarB='varB'
    		#
    		# Recuperation  Arguments
    		def _func_1B(__wfunc_1):
                            @wraps(__wfunc_1)
    			def wrapper(cls):
    				__doc__='Recuperation argument '
    				print('step 1')
    				print (__doc__)
    				_Arg1="Data"
    				return __wfunc_1(cls,_Arg1)
    			return wrapper
    		#
                    @_func_1B
    		def func_2(cls,_Arg):
    			_Arg2='Tranform '+_Arg+' with use '+cls.GlobeVarB
    			_Control=A.C._func_3(cls,_Arg2)
    			print('Return func ='+str(_Control))
    			return _Control
    		#
    	class C ( object):
    		def __init__ (self):
    			__doc__='--init classe C--'
    			print(__doc__)
    			self.GlobeVarC='varC'
    		#
    		def _func_1C(__Wfunc_1):
                            @wraps(__Wfunc_1)
    			def wrapper(cls,_Arg):
    				__doc__='traitement argument '
    				print('step 2')
    				print (__doc__)
    				_Arg1=(_Arg,'test')
    				return __Wfunc_1(cls,_Arg1)
    			return wrapper
    		#
                    @_func_1C
    		def _func_3 (cls,_Arg):
    			__doc__='appel func Base '
    			print('step 3')
    			print (__doc__)
    			_VarOther=_Arg[0]
    			_FuncCmd='__'+_Arg[1]
    			_ClsListRoot=str(__class__).split('\'',2)
    			_ClsRoot=_ClsListRoot[1].lstrip('__main__.')
    			_ClsObj='_'+__class__.__name__
    			_ArgCmdType=_ClsObj+_FuncCmd
    			_ArgCmd=_ClsRoot+'.'+_ArgCmdType
    			print('	_ClsListRoot='+str(_ClsListRoot))
    			print('	_ClsRoot='+str(_ClsRoot))
    			print('	_ClsObj='+str(_ClsObj))
    			print('	_ArgCmdType='+str(_ArgCmdType))
    			print('	_ArgCmd='+str(_ArgCmd))
    			#ligne en erreur
    			#_KsState=getattr(cls,_ArgCmdType)(_VarOther)
    			#
    			_Kstate=getattr(A.C,_ArgCmdType)(_VarOther)
    			return _Kstate
    		#
    		def __test (_Arg):
    			__doc__='fonction Base Test'
    			print('step 4')
    			print(__doc__)
    			_Kstate=_Arg+' and Other Op : Ok'
    			return _Kstate
    #
    #Pour les tests
    if (__name__=='__main__'):
    	print ('__main_execute__')
    	#
    	test=A.B()
    	result=test.func_2()

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/08/2015, 16h06
  2. [Débutant] Appel d'une instance de classe par le nom de cette dernière
    Par Jean-Marie Grave dans le forum VB.NET
    Réponses: 16
    Dernier message: 22/08/2012, 19h33
  3. Appel d'une methode de classe par message inopérant dans une dll
    Par Jacques Deyrieux dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/08/2010, 08h10
  4. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  5. Appel d'une fonction en C par un noyau en asm (link)
    Par julson dans le forum Programmation d'OS
    Réponses: 7
    Dernier message: 22/03/2005, 15h14

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