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.)