Recentemente ho lavorato molto in C # (la mia lingua principale è Python) e mi piace poter fare qualcosa di simile
public string MyProperty{ get; set; }
Tornando a Python mi manca quel tipo di funzionalità. Non mi piace che dovrei fare
class MyClass:
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
self._foo = value
a = MyClass()
a.foo = 7
print(a.foo)
Ho pensato che fosse qualcosa che avrei potuto fare abbastanza facilmente con un descrittore, in questo modo.
class MyClass:
foo = AutoProperty()
a = MyClass()
a.foo = 7
print(a.foo)
Sfortunatamente, durante l'implementazione mi sono reso conto che stavo violando il mio principio di design preferito: KISS. Dopo tutto, quello a cui stavo pensando erano solo variabili di istanza.
class MyClass(): pass
a = MyClass()
a.foo = 7
print(a.foo)
La ragione per cui in Python non vengono sempre utilizzate le proprietà di default è che, di solito, ottenere e impostare le variabili di istanza non è così complicato come i linguaggi Java, soprattutto perché il concetto di private
,% co_de I campi%, e protected
non esistono realmente in Python, tranne per le convenzioni (deboli) e le caratteristiche del linguaggio, e poiché il passaggio da un "campo" a una "proprietà" non è un cambiamento di rottura in Python.
Se in seguito decidiamo che abbiamo bisogno di convalida più complessa durante l'impostazione o i calcoli mentre riceviamo, allora possiamo farlo facilmente implementando le proprietà e non influenzando l'interfaccia della nostra classe.
Mi sto ancora chiedendo - esiste un modo in cui questa tecnica, o una versione modificata di questa tecnica, potrebbe essere usata per fornire una funzione