2012-02-03 14 views

risposta

2

Questa è una domanda molto ampia. Come non si forniscono codice di esempio, mi limiterò a mostrare l'esempio più semplice:

class A(object): 
    def meth1(self, a): 
     self.meth2(a, a*a) 

class B(A): 
    def meth2(self, a, b): 
     return b/a 

b = B() 
b.meth1(10) 
+0

Da dove proviene 'a'? Dove il metodo 'meth'? –

+1

@Tichodroma Scusa, colpa mia. Dovresti pensare mentre scrivi ;-) corretto ora. – glglgl

+0

Cosa succede se le classi sono in moduli separati? cioè file2.py importazione file1 classe TestCase (file1.TestBase): def execute (self): self.pass() file1.py classe TestBase: def Pass (auto): stampa "PASS" testBase = TestBase() testBase.execute() – ThePracticalOne

9

Il punto dietro una sottoclasse è che estende e altera il comportamento della superclasse. La superclasse non può sapere come come una sottoclasse la estenderà.

Edit: ma è ben possibile che la superclasse sa, che della sottoclasse si estenderà esso. Non sono sicuro, se questo è un buon design, però.

0

Ecco quello che ho appena provato:

class A(object): 
    def x(self): 
     print self.y() 

class B(A): 
    def y(self): 
     return 1 

>>> B().x() 
1 

Quindi, a meno che non hai avuto qualche problema specifico, basta chiamare un metodo dalla sottoclasse nella classe base e dovrebbe funzionare.

+1

Mi chiedo perché qualcuno voglia farlo. Perché voglio scrivere 'A' in un modo che anticipi in anticipo come' B' lo estenderà? –

+1

@Tichodroma: Sì, c'è odore di codice qui. Ma forse è per es. il docente dell'OP che è fuori sincrono con la realtà;)? –

+4

@Tichodroma forse non lo sai? Sia 'A' una classe base che può essere estesa, diciamo, a 3 o 4 modi. Non sa come sono implementati, solo quale firma forniscono. Ho visto spesso cose del genere, ad es. in 'MySQLdb'. – glglgl

0

Penso che questo sia correlato all'utilizzo di metodi astratti. La classe genitore definisce i metodi che la sottoclasse dovrebbe implementare e la classe genitore sa che questi metodi saranno implementati. Strutture simili esistono ad esempio in Java.

L'utilizzo di questi in Python è discusso qui così: Abstract methods in Python

7

Credo che questo è un modello utilizzato spesso.

class A(object): 
    def x(self): 
     self.y() 

    def y(self): 
     print('default behavior') 


class B(A): 
    def y(self): 
     print('Child B behavior') 

class C(A): 
    def z(self): 
     pass 

>>>B().x() 
Child B behavior 
>>>C().x() 
default behavior 

È un po 'come una classe astratta, ma fornisce un comportamento predefinito. Non riesco a ricordare il nome del modello dalla cima della mia testa però.

+0

Utilizzando la terminologia C++ sarebbe solo un polimorfismo. Ma con Python è vero per tutto ... – matsjoyce

Problemi correlati