2009-07-12 9 views
3

J'essayais de créer un wrapper python pour une extension tk, donc j'ai regardé Tkinter.py pour apprendre comment le faire. En regardant ce fichier, j'ai trouvé que le modèle suivant apparaît plusieurs fois: une méthode interne (indiquée par le "_" en tête dans le nom de la méthode) est définie, puis une méthode publique est définie pour être le méthode interne.Quel est le but de ce modèle de code?

Je veux savoir quel est l'avantage de le faire.

Par exemple, dans le code pour la classe Divers:

def _register(self, func, subst=None, needcleanup=1): 
    # doc string and implementations is removed since it's not relevant 
register = _register 

Merci.

Répondre

8

Parfois, vous souhaiterez peut-être modifier le comportement d'une méthode. Par exemple, je pourrais le faire (hypothétiquement dans la classe Misc):

def _another_register(self, func, subst=None, needcleanup=1): 
    ... 

def change_register(self): 
    self.register = self._another_register 

def restore_register(self): 
    self.register = self._register 

Cela peut être un moyen très pratique pour modifier le comportement de certains morceaux de code sans sous-classement (mais il est généralement pas conseillé de faire ce genre de chose sauf dans la classe elle-même).

2

From PEP8

En outre, les formes spéciales suivantes à l'aide avant ou arrière underscores sont reconnues (celles-ci peuvent généralement être associés à tous les cas de convention ):

_single_leading_underscore: faible « usage interne "indicateur. Par exemple. "from M import *" n'importe pas les objets dont le nom commence par un trait de soulignement.

+1

Je devine, que l'auteur faisait allusion à la partie externe = _extérieure et non pas à l'ensemble du "trait de soulignement". Vous avez raison, de toute façon. – shylent

+0

OK, mais pourquoi ne pas nommer le def en premier lieu. – Boldewyn

+1

Eh bien, je suppose, il pourrait y avoir plus de ces fonctions comme, disons, _register_experimental, _register_debug, _register_stub ou quelque chose comme ça. – shylent

1

Eh bien, je suis en supposant, il pourrait y avoir une autre appelable interne, qui aurait pu être utilisé, ça n'a pas participé à la version que vous avez. Généralement, je pense que c'est une bonne idée - vous exposer un symbole publiquement et intérieurement cela peut être n'importe quoi, une méthode réelle, une méthode stubbed out, une version de débogage de la méthode, n'importe quoi.

Questions connexes