Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Travailler sur l'attribut d'une classe quand on accède à l'objet

0 votes

Mon problème est assez difficile à expliquer.

Pour des raisons d'élégance, je voudrais travailler sur l'attribut d'une classe à chaque fois que j'accède à l'objet.

Example:

mon objet s'appelle foo, et il a un attribut code.

Quand je fais foo + bar, je veux en fait faire foo.code + bar.

Easy me direz vous, j'overload __sub__ __add__ et compagnie.

Mais comment ça se passe si je veux faire function(foo) ?
Je voudrais en fait que ça fasse function(foo.code)

Est-ce que c'est possible ?

demandé 2-Nov par Rififi (482 points)

Je ne crois pas que ça existe, ça casserait l'expressivité du langage.
C'est à ta fonction de tenter de récupérer l'attribut code lors de l'appel avec getattr(foo, 'code', None).

2 Réponses

0 votes
 
Meilleure réponse

Je doute que cela soit possible.

Lorsque Python rencontre function(foo), il envoit une référence vers foo comme paramètre de function. Changer ce comportement serait de la méta-programmation à un niveau non-accessible en python.

Quelques solutions.

Simplement

Utiliser foo.code. Si ce n'est pas très élégant dans le contexte, c'est soit que :

  • il y a un problème de logique : une fonction s'attend à recevoir un type d'objet, et on veux lui en envoyer un autre, qui ne fonctionne pas de la même manière. Ce n'est plus du duck typing, c'est du trash typing : on envoie n'importe quoi n'importe où, et l'interpréteur se débrouille pour retrouver ses petits. Ça va à l'encontre du langage lui-même, Python étant fortement typé.
  • le naming est à chier : peut-être que code n'est pas le nom d'attribut adapté à la situation.

Duck typing

Dans quelle mesure est utilisé foo.code ?
Si foo.code renvois une string, pourquoi ne pas donner à foo la capacité de se transformer en string lui-même ?

 class foo:

     ...

     def __str__(self):
         return self.code

À partir de ce moment, soit l'appel se fait avec function(str(foo)), ou alors function n'a qu'à s'assurer du type de ses paramètres ; si ce n'est pas déjà fait implicitement à l'utilisation.

M. Bay

Décorer function pour qu'elle utilise systématiquement l'attribut code de son paramètre.

Ce n'est pas désiré à moins que ce problème soit spécifique à function, et non foo comme je le présume à la lecture de la question.

répondu 8-Nov par lucas (2,206 points)
sélectionné 8-Nov par Rififi

Ouais, je m'y attendais un peu. En fait function vient d'une API. Elle accepte des objets d'un certain type, que j'essaie de reproduire avec mon foo. Mais je ne peux pas hériter de ce type d'objet. Parce que. Merci en tout cas.

Un bon nom d'attribut serait du style as_API_object, dans ce cas. API.function(foo.as_API_object) est une construction très standard.

0 votes

Peut être ainsi ?:
-tu surcharges ton add
-et tu travailles sur l' attribut code en tant que property
-tu lui colles un getter ou un setter au cul.

répondu 6-Nov par buffalo974 (2,516 points)

Je ne suis pas sûr de comprendre. Surcharger add je peux faire, pas de souci. c'est function(foo) qui me pose un probleme. (Je peux faire un function(foo.code) mais dans mon contexte c'est pas super élégant).

...