Devo usare una classe come wrapper?

0

Diciamo che ho una classe che rappresenta un composto chimico

class Compound(networkx.Graph): 

    def __init__(self):
        super(Compound, self).__init__()

E diciamo che voglio aggiungere alcune funzionalità extra su un composto chimico. Probabilmente dovrebbe ereditare da Compound. Ma va bene usarlo solo come wrapper per Compound? Ad esempio

class Acid(Compound):

    def __init__(self, compound, *other_data):
        self.__dict__.update(compound.__dict__)

Fondamentalmente, questa classe ha solo dei puntatori alla classe sottostante e quindi mi consente di aggiungere funzionalità senza dover copiare le cose. ha senso? È ragionevole? Lo sto facendo anche nel modo giusto?

    
posta Dannnno 01.12.2014 - 08:55
fonte

1 risposta

1

Probabilmente dovresti usare l'ereditarietà in questo caso, ma anche avvolgere l'oggetto con te per estenderlo. In effetti, la tecnica è abbastanza utile per avere un nome: il pattern Decorator .

Il solito modo di inoltrare tutte le chiamate in Python è di non scherzare con __dict__ , ma di sovrascrivere __getattr__ ("esplicito è meglio di implicito"):

class A(object):
    def __init__(self, *args, **kwargs):
        self._b = B(*args, **kwargs)

    def __getattr__(self, name):
        return getattr(self._b, name)

__getattr__ si attiva solo quando il nome non viene trovato nel solito modo, quindi sei libero di aggiungere o sovrascrivere i nomi in A che non vuoi essere inoltrato a B .

    
risposta data 01.12.2014 - 09:42
fonte

Leggi altre domande sui tag