Python, magia e oggetti che aggiungono attributi al suo proprietario

6

Vorrei iniziare con un disclaimer: sono non il miglior programmatore là fuori. Io faccio tuttavia studio I.T. e ho imparato un po 'di Java e C.

Mi sto bloccando su Python e Django + Mongoengine, non ho intenzione di spiegarlo nei dettagli in quanto devierà dalla domanda originale.

Durante il tentativo di capire cosa sta succedendo a questo bit di Codice Django Ero scioccato da alcuni concetti che mi sembrava di capire.

Principalmente ero completamente confuso dal modo in cui un oggetto poteva aggiungere attributi accessibili a un oggetto genitore e come Python definisce __set__() e __get__() in modo tale da risultare così confusi.

Qualcuno potrebbe dirmi come è ortodosso questo stile di design e se lo trovo bizzarro perché sono un programmatore dilettante.

    
posta holografix 14.04.2013 - 14:52
fonte

1 risposta

7

Stai guardando un descrittore . I descrittori sono tipi speciali di oggetti che possono alterare il loro comportamento quando associati a una classe o istanza Python. Ti danno un aggancio nelle interazioni tra attributi di classe e istanza (impostazione, recupero ed eliminazione).

Le funzioni Python e i property decorator sono descrittori. Le funzioni hanno un metodo __get__ che restituisce un wrapper del metodo quando si accede; questo è il modo in cui i metodi Python possono passare nel parametro self quando si chiama un metodo su un'istanza. property oggetti hanno __get__ , __set__ e __del__ metodi per gestire le interazioni degli attributi e tradurre tali interazioni in chiamate di metodo.

La FileDescriptor classe che hai collegato to, traduce l'accesso agli attributi in una ricerca per il campo denominato sull'istanza a cui sono associati, garantendo che venga restituito un oggetto FieldFile . Agisce come un proxy per il campo, ed è quindi del tutto naturale che cambino il campo denominato sull'istanza a cui sono associati.

Vedi la Guida HOWTO dei descrittori e Implementazione Descrittori sezione della documentazione di Python Datamodel per ulteriori dettagli.

    
risposta data 14.04.2013 - 15:49
fonte

Leggi altre domande sui tag