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 sans détection de type


Sujet :

Python

  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut Classe sans détection de type
    Bonjour,

    En py2.6, je ne peux pas passer un A à B.f() sans lien de parenté entre les classes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A:pass
    class B:
        def f(self):pass
    B.f( A() )
    #TypeError: unbound method f() must be called with B instance as first argument (got A instance instead)
    Quels moyens voyez-vous pour produire une classe B autorisant l'appel "B.f( A() )" ; autre que "class C(A,B)" ? Est-ce faisable avec les métaclasses ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 053
    Par défaut
    On peut utiliser classmethod

  3. #3
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    En supposant que la classe <A> contient tout ce qu'il faut, un "cast" superficiel ferait l'affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A:pass
    class B:
        def f(self):pass
    b = A()
    b.__class__ = B
    B.f( b )
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    “Bêtement”, je dirais une méthode statique*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B:
        @staticmethod
        def f(foo):
            pass
    Ou alors, tu dérives B de A.

    Mais bon, faudrait que tu expliques ce que tu veux faire exactement…

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 053
    Par défaut
    Euh oui staticmethod et pas classmethod, je confond toujours les deux.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 700
    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 700
    Par défaut
    Salut,

    Quels moyens voyez-vous pour produire une classe B autorisant l'appel "B.f( A() )"
    Si B était module, "f" serait fonction.
    B étant class, "f" pourrait être static method ou class method.
    Dans tous les cas, B.f(A()) sera "permis", seuls les arguments récupérés par f seront différents.
    Que choisir? En général, les relations sont définies entre "classes" et réalisées entre "instances" => B().f(A()) serait préférable même si "f" était "class method" - i.e. ne dépend pas d'une instance de B particulière. Dès qu'on sort les "class" de leur rôle "statique", tout est à inventer.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2014, 17h50
  2. [3D]Moteur de raytracing sans les bibliothèques type DirectX, que puis-je utiliser?
    Par cladsam dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 21/04/2006, 17h28
  3. Distribuer des classes sans le .cpp
    Par Patrick Seuret dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/04/2006, 09h22
  4. [HTML] Lien submit sans input de type submit
    Par escafr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 24/11/2005, 10h57
  5. Réponses: 11
    Dernier message: 16/10/2005, 20h21

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