Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/12/2023, à 18:41

chris7522

Probleme compréhension heritage orienté objet( python)

Bonjour a toutes et a tous ,

Je sollicite votre aide , non pas pour la compréhension de l'héritage en lui meme , mais pour cette facon d'ecrire les parametres dans la classe que je n'avais jamais vu auparavant . Dabord le code :

spawn_floating_particle(pos)
def spawn_floating_particle(pos):
    loc = pos[0] + randint(-10, 10), pos[1] + randint(-10, 10)
    color = "yellow"
    direction = pygame.math.Vector2(0, 0)
    speed = randint(50, 100)  # 50   100
    FloatingParticle(particle_group, loc, color, direction, speed)
class FloatingParticle(Particle):
    def __init__(self,
                 groups: pygame.sprite.Group,
                 pos: list[int],
                 color: str,
                 direction: pygame.math.Vector2,
                 speed: int):
        super().__init__(groups, pos, color, direction, speed)
class Particle(pygame.sprite.Sprite):
    def __init__(self,
                 groups: pygame.sprite.Group,
                 pos: list[int],
                 color: str,
                 direction: pygame.math.Vector2,
                 speed: int):
        super().__init__(groups)
        self.pos = pos
        self.color = color
        self.direction = direction
        self.speed = speed
        self.alpha = 255
        self.fade_speed = 400  # 200
        self.size = 4   #4

        self.create_surf()

       Dans ma classe Particule par exemple , j'ai  cette initialisation:

def __init__(self,
                 groups: pygame.sprite.Group,
                 pos: list[int],
                 color: str,
                 direction: pygame.math.Vector2,
                 speed: int):

       Pourquoi a t il complété groups avec pygame.sprite.Group , pos avec list[int], color avec str , direction avec pygame.math.Vector2 , speed avec int . Es ce obligatoire ? Qu'est ce que ca apporte ?

Hors ligne

#2 Le 14/12/2023, à 11:19

Astrolivier

Re : Probleme compréhension heritage orienté objet( python)

salut,

à priori c'est pour donner le type de donnée qu'il y a dans la classe, et pouvoir attribuer la bonne quantité de mémoire. comme ça si tu veux faire une instance de ta classe particule mais que tu lui donnes autre chose qu'un pygame.sprite.Group en premier argument, le programme saura qu'il y a une erreur.


S'il faut absolument faire des sacrifices pour assurer le progrès de l'humanité, ne serait-il pas indispensable de s'en tenir au principe selon lequel c'est à ceux dont on exige le sacrifice que la décision doit revenir en dernier ressort ? (howard zinn)

Hors ligne

#3 Le 14/12/2023, à 11:33

jplemoine

Re : Probleme compréhension heritage orienté objet( python)

Je pense que :
- dans le cas de la définition, c'est la valeur par défaut (La valeur si on ne donne pas de valeur explicite)
- dans le cas de instanciation (appel du constructeur via __init__), c'est la valeur explicite que l'on veut.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#4 Le 14/12/2023, à 18:46

chris7522

Re : Probleme compréhension heritage orienté objet( python)

Bonsoir,
    Merci beaucoup de l'aide que vous m'avez apporté !
    Lorsqu'on donne une valeur par défaut , ne fait on pas :

def __init__(self, color = bleu, speed = 10, ...):

     Pourquoi ici utilise t on les " : "

def __init__(self,
                 groups: pygame.sprite.Group,
                 pos: list[int],
                 color: str,
                 direction: pygame.math.Vector2,
                 speed: int):

     Peux etre une question d'attribution de mémoire comme tu le dit .

Hors ligne

#5 Le 14/12/2023, à 20:00

jplemoine

Re : Probleme compréhension heritage orienté objet( python)

Joker ! : je ne connais pas Python mais je connais la programmation dite structurée et objet --> Ce n'est donc qu'une supposition de ma part.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#6 Le 14/12/2023, à 20:26

soshy

Re : Probleme compréhension heritage orienté objet( python)

Hello,
alors, le : dans les paramètres de fonction, c'est pour les "hint" (indices) de typage. Ca sert surtout aux développeurs ou outils d'analyse de code pour trouver d'éventuelles erreurs.
C'est parfaitement facultatif, on pourrait presque voir ça comme un commentaire.

def somme(a, b):
    return a + b

c'est strictement la même chose que

def somme(a: int, b: int) -> int :
    return a + b

Note que dans ce dernier exemple, on a -> int qui indique que la fonction devrait retourner un int. Mais comme je l'ai dit, comme c'est purement indicatif, la fonction peut bien retourner "quatre-vingt-deux" en toutes lettres (donc une string et non un int) ça ne lui posera aucun problème. En revanche, ton programme aura de forte chances de planter plus tard smile

Par exemple tu peux écrire

def somme(a: int, b: int):
    return a + b
print(somme(2, 3)) # affiche 5
print(somme("a", "b")) # affiche "ab"
print(somme("a", 2)) # erreur

En tant que dev, tu vas voir que a et b devraient être des int et toi tu passes des string (type str en python) lors du 2nd appel, et donc même si ça marche, c'est une mauvaise pratique, on ne doit pas pouvoir sommer des string, car ça n'a pas vraiment de sens de vouloir faire la somme de "toto" et "mamie" par exempe. Et si on veut sommer des types incompatibles, là c'est la fin...
En gros, lorsque la personne a écrit la fonction, elle avait en tête que son usage doit être avec ces types là. L'usage avec d'autres types risque d'avoir des comportements "étrange" ou provoquer des erreurs.



La notation avec le = c'est pour définir une valeur par défaut si le paramètre n'est pas définit

def somme(a = 0, b = 0):
    return a + b

print(somme(2, 3)) # affiche 5
print(somme(2)); # affiche 2
print(somme()); # affiche 0

Et on peut bien sûr mélanger les deux

def somme(a:int = 0, b:int = 0):
    return a + b

print(somme(2, 3)) # affiche 5
print(somme(2)); # affiche 2
print(somme()); # affiche 0

Dernière modification par soshy (Le 14/12/2023, à 23:25)

Hors ligne

#7 Le 15/12/2023, à 15:00

chris7522

Re : Probleme compréhension heritage orienté objet( python)

Magnifique ! Merci milles fois d'avoir pris le temps de me donner toutes ces explications ! C'est parfaitement clair dans ma petite tete . Merci encore big_smile

Hors ligne