2010-03-11 3 views
24

Existe-t-il un moyen de rendre une fonction de classe non-vérifiable? quelque chose comme le mot-clé final de java. c'est-à-dire que toute classe dérogatoire ne peut pas remplacer cette méthode.Comment empêcher une fonction d'être surchargée dans python

+3

Vous n'avez même pas de méthodes * private * en Python, les membres de '__xxx' ne sont que des ombres. Je serais vraiment surpris s'il y avait quelque chose comme un mot-clé 'final'. – Boldewyn

+0

Pourquoi? Quel est le cas d'utilisation pour empêcher cela? Les gens peuvent lire votre source et réécrire la fonction. Qu'essayez-vous de faire? –

+0

Je ne sais pas pourquoi vous présumez que je le veux pour empêcher quelqu'un sinon de le surcharger - Je veux qu'il empêche moi-même de surcharger accidentellement dans le futur. En supposant que j'ai un arbre d'héritage relativement profond, et l'une des classes "plus profondes" redéfinira accidentellement la fonction (l'oubliant même existe) – olamundo

Répondre

31

Le problème est que vous essayez d'écrire en Python en utilisant des philosophies Java. Quelque chose continue, mais pas tous. En Python vous pouvez faire ce qui suit et c'est parfaitement bien, mais va complètement à l'encontre de la façon dont Java pense aux objets.

class Thing(object): 
    x = 1 
something = Thing() 
something.y = something.x 

Si vous le voulez vraiment, vous pouvez essayer le code posted here. Mais comme vous pouvez le voir il y a beaucoup de code là pour l'obtenir pour faire ce que vous voulez. Il convient également de noter que même la personne qui a posté le code dit qu'il peut être passé en utilisant __dict__ ou object.__setattr__.

+4

-1 Un tel code mérite le Prix commémoratif Maginot pour les mécanismes de défense futile. –

+17

Pourquoi le -1? Je n'ai pas écrit le code auquel je me suis connecté et je n'ai pas encouragé son utilisation. Je l'ai trouvé avec une recherche google et j'ai pensé que cela m'a aidé à prouver que le fait d'essayer de faire appliquer la version finale n'est pas une bonne idée en python. – unholysampler

+1

Pour le lier même à lui. –

70

Vous pouvez mettre un commentaire là-dedans à l'effet de:

# We'll fire you if you override this method. 

Il est surprenant de constater à quel point des solutions low-tech comme ce travail dans la pratique.

+2

+1 Et si cela a été découvert à partir d'un rapport de bogue de l'utilisateur, nous allons virer les wallis qui n'ont pas testé l'application correctement. –

+4

Cela devrait faire partie des chaînes de documentation (c'est-à-dire les spécifications de l'API) plutôt qu'un commentaire – vog

0

Oui il y a, ne le faites pas.

Je devrais ajouter à cela après le vote négatif. De tels mécanismes de protection sont perçus par certains comme allant à l'encontre de l'éthique de Python, à savoir que «nous sommes tous des adultes consentants ici». De qui voulez-vous protéger ces fonctions? Et si un commentaire ne suffira pas, pourquoi quelque chose de «plus fort»?

Je documenterais vos attentes et m'attendrais à ce que d'autres programmeurs agissent de façon responsable.

Questions connexes