Ho visto due diversi oggetti Python usati per raggruppare insieme dati arbitrari: classi e funzioni vuote.Perché le classi e le funzioni vuote di Python funzionano come contenitori di dati arbitrari, ma non altri oggetti?
def struct():
pass
record = struct
record.number = 3
record.name = "Zoe"
class Struct:
pass
record = Struct()
record.number = 3
record.name = "Zoe"
Anche se la classe non è vuota, sembra funzionare così a lungo come è definito in fase di esecuzione.
Ma quando sono diventato arrogante e ho provato a farlo con funzioni o classi incorporate, non ha funzionato.
record = set()
record.number = 3
AttributeError: 'set' object has no attribute 'number'
record = pow
pow.number = 3
AttributeError: 'builtin_function_or_method' object has no attribute 'number'
C'è una differenza fondamentale tra incorporato e classi e funzioni "su misura" che tenga conto di questo comportamento?
C'è un bug nel primo esempio: Dovrebbe essere 'registrazione = struct' tecnico senza il'() ', altrimenti 'record' sarà' None' e la riga successiva genererà un'eccezione. Inoltre, si dovrebbe notare che l'uso delle funzioni funziona solo perché una funzione definita dall'utente è solo un altro oggetto in python, il che significa che è possibile assegnare attributi arbitrari. Se la funzione è vuota o no, non ha nulla a che fare con esso. Ma mentre probabilmente si può usare questo per qualche funky metafora/programmazione dinamica, non riesco a pensare a un motivo per cui l'uso di una funzione come contenitore di memoria sarebbe preferibile su una classe ... – l4mpi
@ l4mpi Penso che sia utile se si vogliono emulare chiusure che "scrivono" nel loro ambito racchiudente in Python 2.x, prima di 'nonlocal'. Si utilizzano attributi ad-hoc dell'oggetto funzione locale invece di vars locali. – millimoose
Oops, hai ragione riguardo al primo esempio. –