Funzione di sostituzione di Python per le classi? Come namedtuple _replace?

1

La libreria standard Python offre qualcosa di simile alla funzione di sostituzione personalizzata qui sotto? Posso inserire questo nel mio modulo * utils, ma preferisco usare un'implementazione di libreria standard. Inoltre, questo esempio dovrebbe essere servito da un namedtuple, che ha già _replace, ma ho bisogno della stessa funzione per altre classi nel mio progetto.

from copy import copy

class cab(object):
    a = None
    b = None

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "cab(a=%s, b=%s)" % (self.a, self.b)


# Does not modify source. Creates a copy with the specified modified fields.
def replace(source, **kwargs):
    result = copy(source)
    for key in kwargs:
        setattr(result, key, kwargs[key])
    return result

v1 = cab(3,4)
v2 = replace(v1, a=100)
v3 = replace(v1, b=100)
    
posta clay 09.06.2015 - 18:56
fonte

1 risposta

1

namedtuple ha un tale metodo perché esso stesso è immutabile . Anche altri tipi immutabili nella libreria standard ne hanno uno, come datetime.datetime per esempio.

Non è un modello comune da utilizzare con oggetti mutabili. Quindi no, non esiste una versione integrata per i tipi personalizzati per questo. Le classi personalizzate invariabilmente richiedono comunque una gestione personalizzata.

Nota che la tua utilità è una funzione , e non un metodo neanche. Di solito lo fai come metodo su classi personalizzate:

class cab(object):
    a = None
    b = None

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "cab(a=%s, b=%s)" % (self.a, self.b)

    def replace(self, **kw):
        return type(self)(kw.get('a', self.a), kw.get('b', self.b))
    
risposta data 09.06.2015 - 19:55
fonte

Leggi altre domande sui tag