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 :

Conseils Programmation Orientée Objet


Sujet :

Python

  1. #21
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    En attendant, je vais me noter de rajouter systématiquement des __slots__ à mes classes surtout que je vois que ça fait consommer moins de RAM.
    Ce n'est pas nécessaire sauf lorsqu'on va créer beaucoup d'instances.

    C'est la mémoire des dict associés qu'on va réduire.

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

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    Je commence à en prendre conscience mais les vieux réflexes ont la peau dure.
    Ce n'est pas grave. Ce n'est pas parce que Python autorise à passer outre certains principes (philosophie Python: les programmeurs Pythons sont adultes et consentants) que ces principes n'en sont pas moins bons. En plus quelque chose me dit que ces principes ne sont pas là par hasard et que si tu passes outre, tu le payes tôt ou tard (et plus tu le payes tard plus tu payes )

    Comme annoncé hier, concernant l'écriture en comprehension face à l'écriture classique j'ai codé ce petit test
    Code python : 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
    def fctA(l):
    	return list(x for (x, y) in l if y > 100)
     
    def fctB(l):
    	res=list()
    	for (x, y) in l:
    		if y > 100: res.append(x)
     
    # Les fonctions à tester
    fct={
    	"list" : fctA,
    	"classic" : fctB,
    }
     
    # Initialisation random
    random.seed()
     
    # La liste témoin
    n=1_000_000
    temoin=tuple(zip(random.sample(range(n), n), random.sample(range(n), n)))
     
    # Appel des fonctions dans un ordre aléatoire et affichage du chrono
    print("start", n)
    for (k, v) in random.sample(fct.items(), len(fct)):
    	t=timeit.Timer(partial(v, temoin)).repeat(repeat=10, number=10)
    	print("%s: min=%f, max=%f, avg=%f" % (k, min(t), max(t), sum(t)/len(t)))
    # for

    Et le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    llist: min=1.505935, max=1.562826, avg=1.539030
    classic: min=1.631876, max=1.742919, avg=1.676472


    Citation Envoyé par popo Voir le message
    En attendant, je vais me noter de rajouter systématiquement des __slots__ à mes classes surtout que je vois que ça fait consommer moins de RAM.
    J'ai découvert ce truc il n'y a pas longtemps (cet été) mais j'en ai mis quasiment de partout.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #23
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce n'est pas nécessaire sauf lorsqu'on va créer beaucoup d'instances.

    C'est la mémoire des dict associés qu'on va réduire.

    - W
    Mon but premier, par cette démarche de rajouter des __slots__, n'est pas d'économiser le peu de RAM engendré mais de garantir le respect du principe d'encapsulation.
    Le gain de RAM, c'est juste du bonus.

    Certes, un développeur voulant profiter du comportement natif pourra tout à fait enlever le __slots__.
    Mais alors, je lui poserai la question de pourquoi il le fait.

  4. #24
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par popo Voir le message
    Mon but premier, par cette démarche de rajouter des __slots__, n'est pas d'économiser le peu de RAM engendré mais de garantir le respect du principe d'encapsulation.
    L'encapsulation a trait à la possibilité d'avoir des variables privées ou protégées.
    Ce qui n'existe pas trop avec Python (ce sont des conventions).

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

  5. #25
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    L'encapsulation a trait à la possibilité d'avoir des variables privées ou protégées.
    Ce qui n'existe pas trop avec Python (ce sont des conventions).

    - W
    Et je viens de constater que __slots__ ne fonctionne pas avec les propriété déclarées via @property et @xxx.setter.
    Va falloir que je me fasse une raison.

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    Et je viens de constater que __slots__ ne fonctionne pas avec les propriété déclarées via @property et @xxx.setter.
    Va falloir que je me fasse une raison.
    Mais si çà fonctionne, sauf qu'il faut aussi ajouter les attributs masqués par "property". Propriétés qui ressemblent à celles de C++/Java mais qui sont tout leur contraire

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

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    Et je viens de constater que __slots__ ne fonctionne pas avec les propriété déclarées via @property et @xxx.setter.
    Euh... je vois pas trop ce que tu veux dire...
    Code python : 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 cPoint: 
    	__slots__=("__x", "__y")
     
            @property
    	def x(self): return self.__x
     
            @x.setter
    	def x(self, x): self.__x=x
     
    	def __init__(self, x=0, y=0): 
    		(self.__x, self.__y)=(x, y) 
    # cPoint() 
     
    a=cPoint(2, 3) 
    print(a.x)
    a.x=5
    print(a.x)
    a.y=8				# Ici erreur car "y" n'est pas dans le __slots__
    De mon point de vue, le __slots__ rempli parfaitement sa tâche (il interdit tout attribut non explicitement prévu mais les fonctions cachées dans les getters/setters ne sont pas impactées)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    L'erreur que je faisais, était que je déclarais la propriété directement.
    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
    class Circle:
        __slots__ = ("ray", )
     
        def __init__(self, ray):
            self.__ray = ray
     
        def __str__(self):
            return f"Un cercle de {self.__ray} cm de rayon"
     
        @property
        def ray(self):
            return self.__ray
     
    c = Circle(5)
    print(c)
    et j'obtenais
    ValueError: 'ray' in __slots__ conflicts with class variable

    En changeant ray par __ray dans le __slots__, je m'attendais à pouvoir écrire dans __ray mais non.
    Ce comportement me va, alors je ne fais pas chercher plus loin.

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    En changeant ray par __ray dans le __slots__, je m'attendais à pouvoir écrire dans __ray mais non.
    Non non, le __slots__ liste juste les attributs que peut posséder la classe, rien de plus, rien de moins
    Pour accéder aux attributs privés, on continue à passer par des méthodes éventuellement encapsulée dans des getter/setter, comme avant. Et les méthodes ne sont pas concernées par le __slots__.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #30
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Et du coup pour terminer le tableau, est-ce qu'il y a un mécanisme similaire pour les méthodes ?

  11. #31
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    Et du coup pour terminer le tableau, est-ce qu'il y a un mécanisme similaire pour les méthodes ?
    __slots__ controle les attributs créés dans une instance, les méthodes sont des attributs de la "class".

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

  12. #32
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    Et du coup pour terminer le tableau, est-ce qu'il y a un mécanisme similaire pour les méthodes ?
    Hélas... Mais bon autant écrire c = Circle(5); c.diametre=10 même si je n'approuve pas je peux comprendre... écrire def c.truc():... là franchement ça me dépasserait
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #33
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hélas... Mais bon autant écrire c = Circle(5); c.diametre=10 même si je n'approuve pas je peux comprendre... écrire def c.truc():... là franchement ça me dépasserait
    C'est la raison pour laquelle __slots__ n'est utile que pour réduire la mémoire utilisée lors de la création de beaucoup d'instances (et une optimisation qu'on peut envisager de faire lorsque le programme est au point et non lors de la conception).

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

  14. #34
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    def c.truc() ?
    Non, ça ne me viendrais même pas à l'esprit

    Ce que j'entendais par "même mécanisme pour les méthodes", c'est que def __truc() ne soient pas visible en dehors de ma classe.
    Pour le dire plus simplement, je cherchais à obtenir des méthodes "protected" et des méthodes "private" (toujours dans l'optique de forcer le respect de l'encaspulation).

    De ce que j'ai pu constater d'après mes recherches est que la convention implique que def _truc(self) est considéré comme protected et que def __autre(self) est considéré comme privé mais qu'il n'existe pas (en tout cas je n'ai pas trouvé) de moyen d'interdire l'utilisation de telles méthodes depuis l'extérieur, on compte sur la bonne volonté du consommateur.

  15. #35
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par popo Voir le message
    Ce que j'entendais par "même mécanisme pour les méthodes", c'est que def __truc() ne soient pas visible en dehors de ma classe.
    Ok (on a quitté le monde du __slots__ donc). Pas de souci, c'est le cas. Un attribut ou méthode précédé de deux underscores est invisible du dehors. Je me sers parfois par exemple de méthodes de ce type pour mes traitements internes

    Exemple sur un exercice pour créer un objer permettant de gérer une fraction
    Code python : 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
    # Objet pour gérer une fraction
    class cFrac:
    	# Fonction qui calcule le pgcd de deux nombres
            @staticmethod
    	def __pgcd(x, y):
    		while y: (x, y)=(y, x%y)
    		return x
    	# __pgcd()
     
    	# Getters/Setters/Deletters
    	num=property(lambda self: self.__num, None, None)
    	den=property(lambda self: self.__den, None, None)
     
    	# Le constructeur de la fraction
    	def __init__(self, num=0, den=1):
    		if den == 0: raise ValueError("Le dénominateur ne peut pas être à 0 !!!")
    		pgcd=cFrac.__pgcd(num, den)
    		(self.__num, self.__den)=(num // pgcd, den // pgcd)
    	# __init__()

    La méthode __pgcd() est privée. Toutefois sa privatisation se fait juste par obfuscation du nom. Son nom est en réalité transformé en _cFrac__pgcd(). Donc privé mais malgré tout accessible si on veut s'en donner la peine (à voir au cas par cas si le jeu en vaut la chandelle).

    Citation Envoyé par popo Voir le message
    De ce que j'ai pu constater d'après mes recherches est que la convention implique que def _truc(self) est considéré comme protected et que def __autre(self) est considéré comme privé mais qu'il n'existe pas (en tout cas je n'ai pas trouvé) de moyen d'interdire l'utilisation de telles méthodes depuis l'extérieur, on compte sur la bonne volonté du consommateur.
    Exact. Le simple underscore est juste une affaire de convention. Rien n'interdit de l'utiliser depuis le dehors si on le désire sauf qu'il ne faut pas le faire. Et comme je l'ai dit, le double underscore provoque un changement mais un changement connu et donc récupérable. Hé oui, de ce côté là Python reste ouvert (les programmeurs Python sont adultes et consentants). Est-ce une bonne ou une mauvaise chose je ne saurais le dire. Comme pour tout, je pense que la réponse dépend surtout de ce qu'en fait le consommateur. wiztrics a déjà donné beaucoup d'avis intéressants à ce propos dans ses posts. Un de ses arguments c'est que si on veut passer outre bon ok on peut mais si l'objet évolue ensuite tant pis pour toi car en fait tu n'étais pas censé passer outre. Encore une fois les programmeurs Python sont adultes et consentants.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #36
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    Pour le dire plus simplement, je cherchais à obtenir des méthodes "protected" et des méthodes "private" (toujours dans l'optique de forcer le respect de l'encaspulation).
    çà n'existe pas avec Python... et je ne vois pas comment on pourrait techniquement faire cela avec un langage interprété.

    De ce que j'ai pu constater d'après mes recherches est que la convention implique que def _truc(self) est considéré comme protected et que def __autre(self) est considéré comme privé mais qu'il n'existe pas (en tout cas je n'ai pas trouvé) de moyen d'interdire l'utilisation de telles méthodes depuis l'extérieur, on compte sur la bonne volonté du consommateur.
    Python est un langage de programmation pour des adultes consentants...

    Si vous conduisez une voiture et que vous arrivez devant un feu qui passe au rouge, normalement, vous devez vous arrêter. Mais techniquement rien ne vous interdit d'appuyer sur l'accélérateur!

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

  17. #37
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    çà n'existe pas avec Python... et je ne vois pas comment on pourrait techniquement faire cela avec un langage interprété
    En commençant par ajouter une expression terminale dans la grammaire. PHP est interprété et sais le gérer via les expression terminales "protected" et "private" de sa grammaire.

    Je suis persuadé que l'interpréteur python pourrait le gérer mais que ça impliquerait trop d'incompatibilités pour les innombrables projets existants. Quand on donne beaucoup de liberté, il est compliqué de les retirer. Et en plus ça irait à l'encontre de la philosophie historique de python.

  18. #38
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    En commençant par ajouter une expression terminale dans la grammaire. PHP est interprété et sais le gérer via les expression terminales "protected" et "private" de sa grammaire.
    On peut y accéder via la ReflexionClass.
    Et avec l'introspection, on peut le faire avec Java aussi (mais Java est aussi bien compilé que Python).
    Avec Ruby (qui est interprété), on a aussi des private/protected mais on peut passer à travers quand on veut.


    Citation Envoyé par popo Voir le message
    Je suis persuadé que l'interpréteur python pourrait le gérer mais que ça impliquerait trop d'incompatibilités pour les innombrables projets existants. Quand on donne beaucoup de liberté, il est compliqué de les retirer.
    A quoi servent des protections qu'on peut violer quand on veut ? Sur que çà coûte à implémenter un truc qui ne sert à rien plutôt que de définir des conventions que chacun s'attache à respecter...
    note: les programmeurs sont des adultes consentant vient de G.V.Rossum lui même sur ce sujet.

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

  19. #39
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Il existe des manières de contourner dans beaucoup de langages. Tu en as cité quelques un. Je pourrais également citer le système de réflexion sur les Delphi modernes selon plus ou moins la même implémentation que C#.

    Mais c'est là tout ce qui fait toute la différence. Sur tout ces langages, il n'est pas naturel d"aller contre l'encaspulation (le truc qui sert à rien même s'il constituele fondementde la POO). Il faut contourner et cela demande de connaître des fonctionnalités plus avancées. Un débutant n'y parviendra pas facilement.

    Alors que pour python, il suffit d'appeler la méthode qui est directement disponible. Il sera très facile pour un débutant, même s'il est adulte et consentant, de se tromper et d'appeler une méthode commençant par un underscore. Tu vas me dire que c'est marqué dans tout les bons tutoriels. Mais pour en avoir parcouru un certain nombre, je peux t'affirmer que beaucoup n'en parlent pas.

  20. #40
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par popo Voir le message
    Il sera très facile pour un débutant, même s'il est adulte et consentant, de se tromper et d'appeler une méthode commençant par un underscore.
    Un débutant n'est pas encore un programmeur.

    Pour la conduite des voitures, apprentissage et permis de conduire sont là pour éviter les dégâts.
    Ils restent débutants les 2 premières années.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/04/2015, 13h59
  2. Programation Orientée Objet POO
    Par helmis dans le forum Débuter
    Réponses: 11
    Dernier message: 02/05/2008, 17h53
  3. [VB6]programation orientée objet
    Par meriemeness dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/03/2006, 08h42
  4. [DEBUTANT] Conseil sur la programmation orienté objet
    Par etiennegaloup dans le forum Langage
    Réponses: 7
    Dernier message: 27/05/2005, 12h59
  5. [SGBDOO] Base de données orientée objet
    Par Jaona dans le forum Décisions SGBD
    Réponses: 19
    Dernier message: 14/04/2003, 11h07

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