"metodi privati" vs metodo fuori classe in un modulo python

-1

Ho un modulo con la classe Foo . Foo ha tre metodi:

  • Il costruttore ( __init__() )
  • Un metodo di gestione degli errori ( _error_handler() )
  • Il metodo che effettivamente fa qualcosa. ( run() )

Quindi, ho un sacco di metodi di aiuto che sono effettivamente chiamati da run() . Questi metodi, al momento della stesura di questo documento, sono dichiarati come metodi "privati", ovvero _helper1 , _helper2 ...

Ora la mia domanda è, tali metodi che non fanno realmente parte della portata della classe, dovrebbero essere dichiarati come metodi "privati" come sto facendo adesso? O li metti fuori dalla classe?

class Foo:
    def __init__(self)
    def _error_handler(self, error_code)
    def _helper1(self)
    def _helper2(self)
    def run(self):
        self._helper1()
        some stuff
        self._helper2()
        more stuff

O al contrario, il mio modulo dovrebbe avere il seguente aspetto:

def _helper1()
def _helper2()

class Foo:
    def __init__(self)
    def _error_handler(self, error_code)
    def run(self):
        helper1()
        some stuff
        helper2()
        more stuff
    
posta yzT 21.12.2018 - 16:28
fonte

2 risposte

0

Dipende dalla relazione tra l'attività di questi metodi e lo scopo dell'oggetto.

Se il tuo oggetto è un generatore di report e utilizza molte funzioni di utilità per giustificare, flettere e tabellare stringhe, allora quei metodi hanno poco a che fare con lo scopo dell'oggetto. La generazione di record implica la giustificazione di righe di testo, ma tali routine possono essere utilizzate anche per molti altri scopi, quindi dovrebbero vivere al di fuori della classe - in effetti, probabilmente all'interno di un modulo generale di gestione delle stringhe.

Se i metodi sono strongmente collegati allo stato e alle variabili membro dell'oggetto, allora dovrebbero probabilmente essere funzioni di membri privati. Una buona euristica è che si finisce per passare sempre alcune delle proprie variabili membro a una funzione, quella funzione probabilmente dovrebbe essere una funzione membro stessa.

    
risposta data 21.12.2018 - 16:34
fonte
0

A parte il polimorfismo, la differenza tra metterli a livello di modulo rispetto a quelli di classe è davvero sottile. Quindi, a meno che non sia necessario sovrascriverli in una sottoclasse, la risposta è: non importa molto. Fai ciò che rende più facile leggere e capire. Non hai un parametro nella versione a livello di modulo che mi porterebbe probabilmente a non inserire nella classe.

    
risposta data 21.12.2018 - 16:37
fonte

Leggi altre domande sui tag