5

Python ci fornisce molte possibilità sull'attributo esempio/classe, ad esempio:Qual è l'attributo python ottenere e impostare l'ordine?

class A(object): 
    def __init__(self): 
     self.foo = "hello" 

a = A() 

Esistono diversi modi per accedere/modificare il valore di self.foo:

  1. accesso diretto a.foo
  2. dict interno a.__dict__['foo']
  3. ottenere e impostare a.__get__ e a.__set__, ovviamente ci sono due metodi predefiniti.
  4. getattribute a.__getattribute__
  5. __getattr__ e __setattr__
  6. forse di più.

Durante la lettura del codice sorgente, mi perdo sempre di quale sia il loro ultimo ordine di accesso? Quando utilizzo a.foo, come faccio a sapere quale metodo/attributo verrà chiamato in realtà?

+1

1. 'pippo' è un attributo * istanza *, non un attributo di classe. 2. Poiché non è un '@ property' (o un altro descrittore)' __get__' e '__set__' non saranno coinvolti. – jonrsharpe

+0

Ad es. '__getattr__' vs.' __getattribute__', vedi http://stackoverflow.com/q/3278077/3001761 – jonrsharpe

risposta

6

bar = a.foo ...

  1. invoca a.__getattribute__('foo')
  2. che a sua volta per default guarda in alto a.__dict__['foo']
  3. o invoca foo s' .__get__() se definito in A.

Il valore restituito verrà quindi assegnato a bar.


a.foo = bar ...

  1. invoca a.__getattribute__('foo')
  2. che a sua volta per default guarda in alto a.__dict__['foo']
  3. o invoca foo s' .__set__(bar) se definito su A.
+0

Ben spiegato. grande. – Fawzan

+0

Questo non è abbastanza preciso; '__get__' e' __set__' sono per i descrittori, che sono memorizzati nella * classe *, quindi non verrebbero trovati in 'a .__ dict__'. – jonrsharpe

+0

@jonrsharpe ottimizzato per essere tecnicamente più corretto. – Amber

1

Ho scoperto this great post th a ha una spiegazione dettagliata sulla ricerca di attributi oggetto/classe.

per oggetto attributo di ricerca:

Supponendo classe è la classe e l'istanza è un'istanza di classe, valutando equivale instance.foobar all'incirca questo:

  • chiamata slot tipo per classe. getattribute (tp_getattro). L'impostazione predefinita è la seguente:
    • Classe. dict ha un elemento foobar che è un descrittore di dati?
      • In caso affermativo, restituire il risultato di Classe. dict ['foobar']. get (istanza, Classe).
    • Fa istanza. dict ha un oggetto di Foobar in esso?
      • In caso affermativo, restituire istanza. dict ['foobar'].
    • Classe. dict ha un elemento foobar che non è un descrittore di dati [9]?
      • In caso affermativo, restituire il risultato di Classe. dict ['foobar']. get (esempio, klass). [6]
  • Se l'attributo ancora non è stato trovato, e c'è una classe. getattr, chiama Class. getattr ('foobar').

C'è un'immagine illustrata per questo:

enter image description here

prega controlli anche il blog originale, se interessati, che dà una spiegazione eccezionale sulla classe Python, attributo di ricerca, e metaclasse.

Problemi correlati