Ho un metodo privato def __pickSide(self):
in una classe padre che vorrei sovrascrivere nella classe figlio. Tuttavia, la classe figlio chiama ancora l'ereditato def __pickSide(self):
. Come posso ignorare la funzione? Il nome della funzione della classe figlio è esattamente uguale al nome della funzione del genitore.Come sovrascrivere le funzioni di una classe genitore in python?
risposta
Let l'esempio più semplice:
from dis import dis
class A(object):
def __pick(self):
print "1"
def doitinA(self):
self.__pick()
class B(A):
def __pick(self):
print "2"
def doitinB(self):
self.__pick()
b = B()
b.doitinA() # prints 1
b.doitinB() # prints 2
dis(A.doitinA)
print
dis(B.doitinB)
Lo smontaggio è la seguente:
8 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_A__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
15 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_B__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Come si può vedere, Python storpia i nomi delle funzioni che iniziano con due underscore (e accessi a tale nomi !!) a un nome che include il nome della classe - in questo caso _A__pick
e _B__pick
). Ciò significa che la classe in cui è definita una funzione determina quale dei metodi __pick
viene chiamato.
La soluzione è semplice, evitare metodi pseudo-privati rimuovendo i doppi underscore. Ad esempio, utilizzare _pick
anziché __pick
.
Il problema che si sta verificando è che il doppio trattino sottolinea il nome della funzione anche nelle chiamate. Ciò impedisce al polymorphism di funzionare correttamente poiché il nome a cui è manipolato è basato sul nome della classe in cui è definito il metodo, e non sul nome della classe dell'oggetto a cui si fa riferimento. Sostituire i caratteri di sottolineatura doppia con qualcos'altro risolverà questo problema. sguardo
L'utilizzo dei nomi
__foo
altera il nome del metodo per rendere più semplice l'accesso quando è necessario. Consiglierei di non usarli mai, il che rende le cose come i test andare più agevolmente.Non esiste un privato in Python e, in caso contrario, impedirebbe comunque di farlo. (Questo è il punto di roba privata in lingue che hanno.)
La convenzione comune per indicare che un attributo non è parte dell'interfaccia pubblica di una classe in modo da utilizzare un unico leader sottolineare, come
_foo
. Questo è sufficiente per rendere chiaro il tuo codice separando i tuoi dettagli interni dalla tua API pubblica.
- 1. Python sovrascrivere le variabili in funzioni nidificate
- 2. Uso obsoleto di una classe come classe genitore in Python
- 3. Come ignorare le proprietà annotate JAXB in una classe genitore?
- 4. Sovrascrivere in modo sicuro le funzioni virtuali C++
- 5. Python: funzioni in una classe e di memoria
- 6. Come moltiplicare le funzioni in python?
- 7. Come sovrascrivere una proprietà di classe ereditata in C#?
- 8. Come posso sovrascrivere le funzioni Perl, abilitando più sostituzioni?
- 9. Come ridefinire le funzioni in python?
- 10. Come sovrascrivere un'importazione Python?
- 11. In Gobject, come sovrascrivere il metodo della classe genitore appartiene a un'interfaccia?
- 12. Posso utilizzare una classe C++ in classe Python come superclasse
- 13. Posso avere due funzioni init in una classe python?
- 14. Come ignorare le funzioni di classe String in C#
- 15. Devo dichiarare tutte le funzioni virtuali in una classe base?
- 16. Sovrascrivere le funzioni pure virtuali 'utilizzando' un metodo ereditato separatamente
- 17. Ottieni genitore/i della classe?
- 18. Come "correttamente" sovrascrivere un metodo di classe base?
- 19. Come iniettare in una classe genitore in Aurelia?
- 20. Come sovrascrivere/estendere una classe interna da una sottoclasse?
- 21. Chiamare un costruttore della classe genitore da una classe figlia in python
- 22. Python può chiamare le funzioni Delphi in una DLL?
- 23. Eredita una docstring della classe genitore come attributo __doc__
- 24. Passando le espressioni alle funzioni in python?
- 25. Come accedere alla costante definita nella classe figlio dalle funzioni della classe genitore?
- 26. Creare dinamicamente le funzioni di classe
- 27. python - elenca tutte le funzioni interne di una funzione?
- 28. Come si confrontano le funzioni Python in termini di prestazioni?
- 29. Ottenere tutte le costanti all'interno di una classe in python
- 30. Come trovare un genitore con una classe conosciuta in jQuery?
Si prega di non utilizzare tutti quelli '__'. Stanno confondendo. Non c'è davvero "privato" in Python. Rendono le cose semplici confuse. Si prega di aggiornare la domanda con il più piccolo esempio di codice che mostra il tuo problema. –
Questo è il codice con cui ho problemi ... cosa vuoi di più? So che le funzioni e le variabili "private" sono ancora accessibili in Python, ma l'utilizzo di tutte le funzioni pubbliche non renderà le cose più confuse quando si usa la classe? – wrongusername
"Questo è il codice"? Quale codice? Puoi aggiornare la domanda per fornire effettivamente un esempio di codice effettivo che in realtà non funziona? È difficile indovinare a cosa assomigli il tuo codice. È facile assumere le cose; è facile dare per scontato. "Che cosa vuoi di più?" Codice. Per vedere e vedere quale errore stai effettivamente facendo, non quale errore presumo tu stia facendo. –