Passando gli oggetti a __init__ o passando un parametro comune a e costruendo oggetti all'interno di __init__?

2

Ho una classe Foo che crea istanze di altre classi A , B e C nel suo costruttore. A , B e C condividono lo stesso parametro del costruttore e sono utilizzati in altre parti del codebase, non solo in Foo . A , B e C accedono a una risorsa esterna configurata dal parametro passato. Nei test unitari, A , B e C sono presi in giro con unittest.mock.patch .

class Foo(object):
    def __init__(self, param):
        self.a = A(param)
        self.b = B(param)
        self.c = C(param)

foo = Foo('param')

Il seguente sarebbe un miglioramento o solo un codice non necessario? Passare in unittest.mock.Mock oggetti nei test preferiti rispetto a unittest.mock.patch ? In pratica, A , B e C dovrebbero sempre condividere lo stesso parametro.

class Foo(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @classmethod
    def from_param(cls, param):
        return cls(A(param), B(param), C(param))

foo = Foo.from_param('param')
    
posta user95275 20.01.2016 - 19:45
fonte

1 risposta

1

Questo è un po 'difficile da ragionare in isolamento, ma generalmente preferisco il secondo approccio. Ti dà la flessibilità di passare qualsiasi tre oggetti (compresi i tuoi mock). Se non è un invariante di classe che siano tutti costruiti con gli stessi parametri, questa sembra essere una buona cosa. Il classmethod fornito per il caso in cui vuoi A , B , C costruito con gli stessi parametri lo rende ancora conveniente da utilizzare nel caso comune. Inoltre, è possibile aggiungere più funzioni di fabbrica in un secondo momento in caso di necessità.

Ovviamente, non dovresti nemmeno estrarlo troppo, ma il fatto che tu pensi a prendere in giro mi suggerisce che non è questo il caso.

    
risposta data 20.01.2016 - 21:31
fonte

Leggi altre domande sui tag