Supponiamo di avere un oggetto di base con una manciata di punti di dati rilevanti per l'autore.
class A(object):
def __init__(self, x, y, width, length):
self.x = x
self.y = x
self.width = x
self.length = x
Quindi continuiamo a istanziare diversi A
oggetti e li inseriamo in un elenco, come i programmatori sono soliti fare.
Ora supponiamo che questi oggetti debbano essere controllati per uno stato particolare ogni tanto, ma non è necessario controllarli su ogni passaggio, perché il loro stato non cambia particolarmente rapidamente. Quindi un metodo di verifica è scritto da qualche parte:
def check_for_ticks(object_queue):
for obj in object_queue:
if obj.checked == 0 and has_ticks(obj):
do_stuff(obj)
obj.checked -= 1
Ah, ma aspetta: non è stato progettato con l'attributo obj.checked
! Beh, non è un grosso problema, Python è gentile e ti consente di aggiungere attributi ogni volta, quindi cambiamo il metodo un po '.
def check_for_ticks(object_queue):
for obj in object_queue:
try:
obj.checked =- 1
except AttributeError:
obj.checked = 0
if obj.checked == 0 and has_ticks(obj):
do_stuff(obj)
Funziona, ma mi dà una pausa. I miei pensieri sono misti, perché mentre è un attributo funzionale per dare un oggetto e risolve un problema, l'attributo non è realmente usato dall'oggetto. A
probabilmente non modificherà mai il proprio attributo self.checked
, e in realtà non è un attributo di cui "ha bisogno di essere informato" - è semplicemente incredibilmente conveniente dargli quell'attributo di passaggio.
Ma - cosa succede se ci sono più metodi che potrebbero voler contrassegnare un oggetto? Sicuramente non si crea la classe con ogni attributo che potrebbe essere indicato da un altro metodo per
Dovrei dare agli oggetti nuovi attributi in questo modo? Se non dovessi, qual è l'alternativa migliore semplicemente dando loro nuovi attributi?