Domande sugli attributi Python e dir ()

2

Ho due domande correlate agli attributi e dir() :

  1. Quali sono gli attributi? È un oggetto all'interno di un altro oggetto? O è un metodo, proprietà, ecc?

  2. Quando fai dir() , quali sono le differenze tra gli slot e il resto degli attributi?

posta Adi Gal 09.03.2016 - 20:52
fonte

1 risposta

2

Attributi

What are attributes? Is it an object inside of another object? Or is it a method, property, etc?

Semanticamente, in inglese, proprietà e attributi sono same same . Tuttavia, in Python, generalmente intendiamo property per indicare un attributo che ha il suo accesso (ricerca, assegnazione ed eliminazione) gestito a livello di programmazione.

Gli attributi forniscono informazioni sugli oggetti. Ad esempio, un cerchio può essere definito dal suo raggio. Quindi potremmo dire che l'attributo che definisce un cerchio è il suo attributo raggio. Potremmo modellare un oggetto del genere come questo:

class Circle(object):
    def __init__(self, radius):
        self.radius = radius

Tuttavia, altre informazioni che potrebbero piacerci sapere su un tale cerchio potrebbero essere il diametro, la circonferenza o la sua area. Questi sono anche attributi di un cerchio. Tuttavia, dal momento che possiamo calcolarli dal raggio, potremmo scegliere di utilizzare il% decoratore di property di Python:

    @property
    def diameter(self):
        return self.radius * 2

Una proprietà definita in questo modo sarebbe di sola lettura. Potremmo fare allo stesso modo per circonferenza e area (ma l'implementazione è lasciata come esercizio per il lettore). Utilizziamo sia l'attributo raggio sia la proprietà diametro nello stesso modo:

>>> c = Circle(5)
>>> c.radius
5
>>> c.diameter
10

Ma troveremo che se proviamo a cambiare il diametro, non possiamo direttamente, dovremmo invece cambiare il raggio.

>>> c.diameter = 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>> c.radius = 10
>>> c.diameter
20

Tutto è un oggetto in Python

Is it an object inside of another object?

Bene, in Python tutto è un oggetto, quindi anche tutti i membri dati di un oggetto sono oggetti. Negli oggetti che non dichiarano __slots__ , i membri dati sono memorizzati in un dizionario (un altro oggetto) sul nome dell'attributo __dict__ .

Se gli oggetti dichiarano __slots__ i membri dei dati sono memorizzati in una specie di tupla mutabile, ma ci sono un sacco di avvertimenti per __slots__ .

Metodi

Or is it a method, property, etc?

Un metodo è in realtà più di un attributo della definizione di classe (è in __dict__ della classe, non dell'istanza), ma è associato all'istanza su una ricerca tratteggiata da un'istanza (per ulteriori informazioni su questo, vedi descrittori - un argomento avanzato). Semanticamente, è anche un attributo dell'istanza però.

Puoi leggere ulteriori informazioni sui metodi qui .

Attributi e dir

When you do dir(), what's the differences between the slots and the rest of the attributes?

dir ti dice solo (la maggior parte) dei nomi disponibili sull'oggetto.

>>> dir(c)
['__class__', '__delattr__', ... 'diameter', 'radius'] # some removed

Quindi include funzioni e proprietà che sono in realtà attributi della classe dell'oggetto.

Se vuoi sapere quali sono i membri effettivi dei dati in un oggetto, usa il vars integrato:

>>> vars(c)
{'radius': 5}

E con questa ispezione vediamo che i dati memorizzati per questa cerchia non sono sia il raggio che il diametro, ma solo il raggio.

(Un contro-esempio unico per dir : se fai dir(AClass) non ti dirà comunque il AClass.mro() , che è principalmente un dettaglio di implementazione CPython.)

    
risposta data 10.03.2016 - 04:36
fonte

Leggi altre domande sui tag