[python] Impossibile impostare gli attributi della classe dell'oggetto



Answers

Come hanno detto altri rispondenti, un object non ha un __dict__ . object è la classe base di tutti i tipi, inclusi int o str . Quindi qualunque cosa sia fornita object sarà un peso anche per loro. Anche qualcosa di semplice come un __dict__ facoltativo richiederebbe un puntatore aggiuntivo per ogni valore; ciò sprecherebbe ulteriori 4-8 byte di memoria per ogni oggetto nel sistema, per un'utilità molto limitata.

Invece di fare un'istanza di una classe dummy, in Python 3.3+, puoi (e dovresti) usare types.SimpleNamespace per questo.

Question

Quindi, stavo giocando con Python mentre rispondevo a questa domanda , e ho scoperto che questo non è valido:

o = object()
o.attr = 'hello'

a causa di un AttributeError: 'object' object has no attribute 'attr' . Tuttavia, con qualsiasi classe ereditata dall'oggetto, è valida:

class Sub(object):
    pass

s = Sub()
s.attr = 'hello'

Stampa di s.attr display 'ciao' come previsto. Perché è così? Cosa nella specifica del linguaggio Python specifica che non è possibile assegnare attributi agli oggetti vanilla?




È perché l'oggetto è un "tipo", non una classe. In generale, tutte le classi che sono definite nelle estensioni C (come tutti i tipi di dati incorporati e cose come gli array numpy) non consentono l'aggiunta di attributi arbitrari.




Questo è (IMO) uno dei limiti fondamentali con Python - non è possibile riaprire le classi. Credo che il vero problema, però, sia causato dal fatto che le classi implementate in C non possono essere modificate in fase di runtime ... le sottoclassi possono, ma non le classi base.




Links