Se ho due classi e una di esse ha una funzione che desidero utilizzare nella mia altra classe, che cosa utilizzo in modo da non dover riscrivere la mia funzione?Python utilizzando metodi di altre classi
20
A
risposta
25
ci sono due opzioni:
- instanciate un oggetto nella classe, quindi chiamare il metodo desiderato su di esso
- uso @classmethod per trasformare una funzione in un metodo di classe
Esempio:
class A(object):
def a1(self):
""" This is an instance method. """
print "Hello from an instance of A"
@classmethod
def a2(cls):
""" This a classmethod. """
print "Hello from class A"
class B(object):
def b1(self):
print A().a1() # => prints 'Hello from an instance of A'
print A.a2() # => 'Hello from class A'
Oppure utilizzare l'ereditarietà, se del caso:
class A(object):
def a1(self):
print "Hello from Superclass"
class B(A):
pass
B().a1() # => prints 'Hello from Superclass'
6
si crea una classe da cui ereditano entrambe le classi.
C'è un'eredità multipla, quindi se hanno già un genitore non è un problema.
class master():
def stuff (self):
pass
class first (master):
pass
class second (master):
pass
ichi=first()
ni=second()
ichi.stuff()
ni.stuff()
21
Ci sono diversi approcci:
- Inheritance
- delegazione
- Super-subdolo delegazione
Gli esempi seguenti utilizzano ogni per condividere una funzione che stampa un membro.
Inheritance
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(Common):
def __init__(self):
Common.__init__(self,"Alpha")
class Bravo(Common):
def __init__(self):
Common.__init__(self,"Bravo")
delegazione
class Common(object):
def __init__(self,x):
self.x = x
def sharedMethod(self):
print self.x
class Alpha(object):
def __init__(self):
self.common = Common("Alpha")
def sharedMethod(self):
self.common.sharedMethod()
class Bravo(object):
def __init__(self):
self.common = Common("Bravo")
def sharedMethod(self):
self.common.sharedMethod()
Super-subdolo delegazione
Questa soluzione si basa fuori del fatto che non v'è nulla di speciale membro Python funzioni; è possibile utilizzare qualsiasi funzione o oggetto richiamabile purché il primo parametro sia interpretato come l'istanza della classe.
def commonPrint(self):
print self.x
class Alpha(object):
def __init__(self):
self.x = "Alpha"
sharedMethod = commonPrint
class Bravo(object):
def __init__(self):
self.x = "Bravo"
sharedMethod = commonPrint
Oppure, un modo simile subdolo di ottenere la delega è quello di utilizzare un oggetto invocabile:
class Printable(object):
def __init__(self,x):
self.x = x
def __call__(self):
print self.x
class Alpha(object):
def __init__(self):
self.sharedMethod = Printable("Alpha")
class Bravo(object):
def __init__(self):
self.sharedMethod = Printable("Bravo")
Problemi correlati
- 1. Come estendere correttamente altre classi in Python? (python v3.3)
- 2. Ottieni variabile in altre classi
- 3. Metodi non utilizzati di Ruby: è possibile forzare il binding alle istanze di altre classi?
- 4. Accesso agli oggetti di altre classi
- 5. classi Rendere pubbliche ad altre classi in C++
- 6. marcatore @see, collegare altri metodi di classi
- 7. Classi generiche in metodi generici
- 8. organizzazione di classi e moduli in python
- 9. Metodi statici su classi generiche?
- 10. metodi virtuali e classi template
- 11. Aggiunta di metodi alle classi POCO
- 12. Metodi di chiamata C# nelle classi generiche
- 13. Perché PHP consente di chiamare metodi privati da altre istanze?
- 14. Come creare un decoratore di classi Python in grado di eseguire il wrapping di istanze, classi e metodi statici?
- 15. Identifica la firma del metodo utilizzando classi ereditate nei metodi astratti di Java
- 16. Metodi statici Python, perché?
- 17. Accesso al metodo da altre classi Obiettivo-C
- 18. Classi astratte (con metodi virtuali puri) in Cython
- 19. Nascondere metodi di classe utilizzando .call/.apply
- 20. Aggiungi eventi utilizzando i metodi di estensione
- 21. La dichiarazione di una classe Java strictfp significa che i metodi chiamati in altre classi sono anche strictfp?
- 22. Metodi statici di classe Python
- 23. Metodi di estensione in Python
- 24. Come posso intercettare le chiamate ai metodi "magici" di python in nuove classi di stile?
- 25. di Python(), classi base astratte, e NotImplementedError
- 26. Metodi modello e classi modello C++
- 27. Quando e perché utilizzare classi/metodi astratti?
- 28. Approccio test unitario per classi/metodi generici
- 29. Metodi pubblici extra nelle classi derivate?
- 30. Classi C# - Perché tanti metodi statici?
orribile e illeggibile IMHO. –
Qui non esiste più ereditarietà. Questa è un'eredità singola, sebbene sia possibile che tu stia pensando all'eredità gerarchica. – Nikwin
@Nikwin, +1 come stavo per dirlo. –