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")
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. –