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.

SignalDescriptor : 2 problemes : property , attribut d'instance (tuto sur la classe)

0 votes

Question concernant les descripteurs sur l' article http://sametmax.com/les-descripteurs-en-python/
Supposons un jeu de casino en réseau avec une GUI (c'est pour l'exemple, pas de javascript ici).

Admettons que je parte sur un pattern MVC.
Je vérifie coté serveur que les requêtes (ex miser,acheter,gagner etc) envoyées par le client soient valide (éviter la triche).
J'aurai un contrôleur qui va recupérer une instance de vue et une du modele.

Je pense mettre un signal descripteur sur la vue pour l'interactivité, et sur le modèle pour surveiller la génération d' évènements aléatoires.
Mon controleur permettera aux infos de circuler entre la vue et le modele.

Dans mon pattern, je veux mettre le SignalDescriptor décris par Sam sur plusieurs attributs (jetons,cartes,cash,équipier,etc.) de toutes mes instances Joueurs connectés.

Le problème est que dans l' article on a:

class Joueur(object):

    credits = SignalDescriptor("credits", 0)

On attaque sur un attribut de classe, et je n'arrive pas a reproduire le comportement sur un attribut d' instance. Mes bidouilles ont foirées.Comment réécrire proprement ?

Deuxième question, plutôt qu'un jeu de casino, c'est un jeu de géométrie...

class Shape():
    def __init__(self,L,H):
        self.L = L
        self.H= H
    @property
    def surface(self):
        return self.L*self.H

rect1 = Shape(3,4)
rect2 = Shape(4,3)

Pour une instance rectangle d'une classe Shape, comment surveiller seulement une property de surface (self.S=self.L x self.H) plutôt qu'un attribut L ou H ?

enter code here

demandé 8-Fev par buffalo974 (2,690 points)
edité 8-Fev par buffalo974

1 Réponse

0 votes

Question descripteurs

On attaque sur un attribut de classe, et je n'arrive pas a reproduire le comportement sur un attribut d' instance. Mes bidouilles ont foirées.Comment réécrire proprement ?

Ya leplatrem dans les commentaires de l'article qui est arrivé à une solution:

class classproperty(object):
    def __init__(self, getter):
        self.getter = getter

    def __get__(self, instance, owner):
        return self.getter(owner)

Exemple d'usage :

class MyClass(object):
    @classproperty
    def tagname(cls):
        return "data-%s" % cls.__name__

Question géométrie

Je comprend pas trop la question, à cause du sens du mot surveiller.

En considérant que la définition du mot soit «éviter toute modification par le code client en passant l'attribut en privé et en proposant un setter», alors non, il n'est pas possible de faire un seul attribut surface qui permette de gérer deux attribut H et L, car à une surface donnée correspond une infinité de combinaison de H et L.

Néanmoins, il est possible de forcer l'utilisateur à indiquer l'un ou l'autre avec la surface:

def set_surface(surface:float, *, h:float=None, w:float=None) - (float, float, float):
    if surface:
        if h and w:
            if h * w == surface:
                return h, w, surface
            else:
                raise ValueError("Inconsistency: given surface is not the same as described by given height and width.")
        elif h:
            return h, surface / h, surface
        elif w:
            return surface / w, w, surface
        else:
            raise ValueError("Height or width must be provided along the surface.")
    else:
        if h and w:
            return h, w, h * w
        else:
            raise ValueError("If no surface given, both height and width must be provided")
répondu 17-Fev par lucas (2,308 points)

je veux le contraire en fait :

1-pas de classproperty ,car c'est bien un attribut d'instance que je souhaite
il semblerait que ce ne soit pas possible dans ce pattern.

Why can't descriptors be instance attributes?

it has been answered that:

descriptor objects needs to live in the class, not in the instance

because that is the way that the getattribute is implemented.

https://stackoverflow.com/questions/12599972/descriptors-as-instance-attributes-in-python
Dommage, ça m' aurait bien aidé.
Il me faut avancer sur le pattern Observer à la place apparemment.

2-pour la géométrie, je veux seulement savoir si la surface change.
Donc si on passe de (3,4) à (4,3) par exemple, il n'y a pas de changement de surface, donc cet événement ne m’intéresse pas.
Pareil, c'est un observer qu'il faut je pense , mais sur une property ce coup si.

...