Gli oggetti di classe supportano due tipi di operazioni: riferimenti di attributo e istanza
I riferimenti agli attributi utilizzano la sintassi standard utilizzata per tutti i riferimenti agli attributi in Python: nome_oggetto. I nomi di attributo validi sono tutti i nomi presenti nello spazio dei nomi della classe al momento della creazione dell'oggetto di classe. Quindi, se la definizione della classe sembrava così:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
quindi MyClass.i
e MyClass.f
sono riferimenti di attributi validi, che restituiscono rispettivamente un numero intero e un oggetto funzione. È inoltre possibile assegnare attributi di classe, quindi è possibile modificare il valore di MyClass.i
per assegnazione. __doc__
è anche un attributo valido, che restituisce il docstring appartenente alla classe: "Una semplice classe di esempio".
L'istanza di classe utilizza la notazione di funzione. Fai solo finta che l'oggetto class sia una funzione senza parametri che restituisce una nuova istanza della classe. Per esempio:
x = MyClass()
L' operazione di istanza ("chiamata" di un oggetto di classe) crea un oggetto vuoto. Molte classi amano creare oggetti con istanze personalizzate per uno stato iniziale specifico. Pertanto una classe può definire un metodo speciale chiamato __init__()
, in questo modo:
def __init__(self):
self.data = []
Quando una classe definisce un __init__()
metodo, l'istanza di classe richiama automaticamente l'istanza di classe __init__()
appena creata. Quindi, in questo esempio, è possibile ottenere una nuova istanza inizializzata da:
x = MyClass()
Naturalmente, il __init__()
metodo può avere argomenti per una maggiore flessibilità. In tal caso, gli argomenti forniti all'operatore di istanza di classe vengono passati a __init__()
. Per esempio,
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
x.r, x.i
Tratto dalla documentazione ufficiale che mi ha aiutato di più alla fine.
Ecco il mio esempio
class Bill():
def __init__(self,apples,figs,dates):
self.apples = apples
self.figs = figs
self.dates = dates
self.bill = apples + figs + dates
print ("Buy",self.apples,"apples", self.figs,"figs
and",self.dates,"dates.
Total fruitty bill is",self.bill," pieces of fruit :)")
Quando si crea un'istanza della classe Bill:
purchase = Bill(5,6,7)
Ottieni:
> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18 pieces of
> fruit :)
x = 'Hello'
al di fuori di init ma all'interno della classe? è come Java dove è uguale o diventa una variabile statica che viene inizializzata una sola volta?