MyBase
impone l'implementazione del metodo f()
in tutti i bambini. Questo può essere ottenuto utilizzando abc.ABCMeta
per rendere f()
un abstractmethod
:
import abc
class MyBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def f(self, x):
pass
class Child1(MyBase):
def f(self, x):
print(x)
class Child2(MyBase):
pass
Child1().f(4) # prints 4
Child2().f(4) # TypeError: Can't instantiate abstract class Child2 with abstract methods f
MyBase() # TypeError: Can't instantiate abstract class MyBase with abstract methods f
.. o in alternativa, per NotImplementedError
:
class MyBase():
def f(self, x):
raise NotImplementedError('Abstract method not implemented.')
class Child1(MyBase):
def f(self, x):
print(x)
class Child2(MyBase):
pass
Child1().f(4) # prints 4
Child2().f(4) # raises implementation error
MyBase() # does NOT raise error
L'uso di una classe astratta invece di restituire NotImplementedError
non consente per esempio l'istanziazione accidentale di MyBase()
.
Ci sono altri vantaggi (o svantaggi) dall'usare una classe astratta su NotImplementedError
?