Ogni classe in python eredita dalla classe 'oggetto'. Mi sto interrogando sul meccanismo interno dell'implementazione della classe "oggetto". Perché la classe 'oggetto' non può essere assegnata a nessun attributo utente? Sono convinto che sia legato alla gestione della memoria, ma se l'utente pensa di implementare la gestione della memoria, perché non può ignorare la classe "object" in python? Questo è basato sul mio interesse e voglio sapere su quale potrebbe non avere un'applicazione programmatica, ma sarebbe bello conoscere la funzionalità interna della lingua stessa.perché la classe 'oggetto' non ha attributi impostati dall'utente
risposta
Se dovessi ricavare il ragionamento da principi primi, potrei pensare in termini di meccanismo di __slots__
. Alcuni tipi di classi hanno bisogno solo di un piccolo numero di attributi, e l'insieme di attributi è sempre fissato per ogni istanza, e quindi la flessibilità di una funzionalità di attributi utente "dict" sarebbe sprecare di cpu (cercare attributi con nomi dinamici) e spazio (il sovraccarico di un dict vuoto, piccolo ma non zero), che può davvero aggiungere un sacco di spese generali se ci sono un gran numero di istanze.
ovviamente questo è esattamente il problema risolto dal meccanismo __slots__
. lo spazio è allocato sull'oggetto per gli attributi definiti negli slot. se è presente un attributo __dict__
, è possibile trovare gli attributi non slot e, se non esiste alcun attributo __dict__
, non si ottengono né gli attributi dinamici né il costo dell'oggetto dict non necessario (che è un oggetto heap aggiuntivo diverso dall'istanza stessa).
Per quanto riguarda il motivo per cui object
sé non ha uno slot per __dict__
, bene, anche se una sottoclasse ha indicato che non l'hanno fatto necessità il __dict__
fessura, se ereditare da una classe che fa , quindi l'istanza deve ancora avere un __dict__
; seavesse un __dict__
allora ogni classe pagherebbe anche il prezzo di uno __dict__
, anche se non ne aveva bisogno.
Invece; le sottoclassi ottengono __dict__
(e __weakref__
, per ragioni analoghe) a meno che esse non definiscano un attributo di classe __slots__
.
E perché è necessaria una semplice istanza di object
? Hai solo bisogno di un sacco di attributi? bene quindi utilizzare un dict
. Se hai effettivamente bisogno di un oggetto di qualche tipo con comportamenti e attributi, allora stai comunque creando una sottoclasse.
Circa l'unico motivo che posso immaginare con object()
invece di una sottoclasse di object
, è quando l'unica caratteristica dell'istanza che è di interesse è la sua identità. Questo sarebbe venuto quando una funzione prende argomenti, e per i quali None
o qualche altro valore sentinella ovvio dovrebbe essere inteso come distinto dal default:
BAR_DEFAULT = object()
def foo(bar=BAR_DEFAULT):
if bar is BAR_DEFAULT:
#...
In questo caso è né necessario né particolarmente desidera attributi nella istanza di object
,
I tipi definiti in C non possono mai avere attributi assegnati dall'utente. Se si desidera sostituire object
a livello globale, è necessario eseguire iterazioni su ogni singola classe esistente, quindi sostituire __builtin__.object
per catturare tutta la creazione futura della classe. E anche questo non è affidabile poiché il vecchio oggetto potrebbe essere associato altrove.
Questo è stato discusso su StackOverflow, ma non riesco a trovare la discussione per collegarlo.
La ragione per cui mi sono chiesto è perché ho voluto semplificare questo esempio:
class Box(object):
pass
box = Box()
box.a = "some value"
box.b = 42
Qui sto usando box
come una sorta di dizionario, quella in cui le chiavi possono essere solo identificatori. Lo faccio perché è più conveniente scrivere box.a
rispetto a box["a"]
.
ho voluto fare questo:
box = object()
box.a = "some value" # doesn't work
La ragione è che object
è la radice di tutti gli oggetti in Python. Qualsiasi attributo che object
deve avere in qualsiasi tipo derivato. Se si desidera creare un elenco di grandi dimensioni contenente un numero elevato di oggetti, si desidera che siano il più piccolo possibile in modo da non esaurire la memoria. Quindi lo object
è minimo.
EDIT: ho trovato il link stavo cercando di ricordare:
- 1. psycopg2: AttributeError: 'modulo' oggetto non ha attributi 'extra'
- 2. Perché la classe oggetto (root) non interferisce con l'ereditarietà multipla
- 3. Perché non posso aggiungere direttamente attributi a qualsiasi oggetto Python?
- 4. La classe non ha inizializzatori: Swift Errore
- 5. Python - L'oggetto 'str' non ha attributi 'close'
- 6. patch un rese classe "AttributeError: oggetto Mock ha nessun attributo" quando si accede esempio attributi
- 7. android ClassNotFoundException: Non ha trovato la classe
- 8. jQuery: Controlla se un oggetto ha classe
- 9. Python CSV non ha attributi 'Writer'
- 10. Attribute.IsDefined non visualizza gli attributi applicati con la classe MetadataType
- 11. TypeError Object [oggetto oggetto] non ha alcun metodo SubSelf, TypeError Oggetto [oggetto oggetto] non ha metodo intersectsPlane
- 12. L'oggetto 'unicode' non ha attributi 'chiavi'
- 13. In oggetto classe, come aggiornare automaticamente gli attributi?
- 14. Diagnosi perché attributi DebuggerTypeProxy non funzionano
- 15. Perché Visual Studio ha contrassegnato la mia classe come componente?
- 16. Perché $ _SERVER ["PHP_AUTH_USER"] e $ _SERVER ["PHP_AUTH_PW"] non sono impostati?
- 17. Perché SerializationInfo non ha i metodi TryGetValue?
- 18. Perché la classe Object ha un blocco statico?
- 19. Perché la classe String ha un costruttore di copie?
- 20. Perché il JDK ha sia Math.random() sia la classe Random?
- 21. oggetto non ha attributo _state
- 22. Perché la mia classe non è accettabile
- 23. oggetto 'WSGIRequest' non ha alcun attributo 'successful_authenticator'
- 24. Perché la classe media-body nel bootstrap ha larghezza 10.000px e la classe media ha overflow nascosto e zoom 1?
- 25. La classe .. $ Proxy $ _ $$ _ WeldClientProxy 'non ha la proprietà' ... '
- 26. oggetto ListBox non aggiornato quando la proprietà ha cambiato
- 27. La classe C++ non ha un membro chiamato
- 28. oggetto 'MyClass' non ha alcun attributo '__getitem__'
- 29. non ha classe tipo C++
- 30. Perché la classe HttpUtility non viene riconosciuta?
In realtà, in Python 2.x, solo le classi di nuovo stile ereditano da '' object''. (Bene, e in Python 3.x, ma tutte le classi sono di nuovo stile, quindi è inutile menzionarlo). –
Questa non è una buona ragione per un downvote - ma è un ottimo posto per una risposta per educare il richiedente ... sembra una domanda ben pensata e valida per me. +1 – ImGreg
Jack, puoi chiarire se stai parlando di aggiungere attributi alla classe dell'oggetto o alle istanze di quella classe? –