Utilizzo di NotImplementedError anziché di classi astratte

3

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 ?

    
posta Fermi paradox 31.07.2016 - 11:03
fonte

2 risposte

3

Dovresti usare una classe astratta perché è la scelta appropriata per il tuo modello, non a causa di alcuni effetti collaterali desiderati. Quindi, invece di pensare ai benefici, pensa al significato.

Una classe astratta classifica le classi e consente di raggruppare dati e comportamenti comuni per quel gruppo di classi. Se questo si adatta al tuo dominio del problema (puoi riconoscere più classi con proprietà comuni), usa una classe astratta. Se non lo fa e vuoi solo suggerire un implementatore per completare un'implementazione, creare un modello o qualcosa e lanciare le eccezioni.

Non essere in grado di creare un'istanza di una classe astratta non è un "inconveniente" della cosa, è inerente al suo scopo.

    
risposta data 31.07.2016 - 11:16
fonte
2

"Classe astratta" è un concetto di programmazione generale. Una classe astratta come concetto di programmazione è una classe che non dovrebbe mai essere istanziata affatto ma dovrebbe essere usata solo come una classe base di un'altra classe.

In alcune lingue è possibile specificare esplicitamente che una classe deve essere astratta. Ad esempio, in C ++ qualsiasi classe con un metodo virtuale contrassegnato come privo di implementazione. In alcune lingue, non esiste una cosa del genere.

Se la tua lingua lo consente, scrivi classi astratte in un modo che le contraddistingua esplicitamente come astratte. In caso contrario, utilizzare altri mezzi che consentono di rilevare l'istanziazione di una classe astratta o semplicemente ignorare il problema poiché l'utilizzo di un'istanza di una classe astratta non produrrà probabilmente alcun risultato utilizzabile.

    
risposta data 31.07.2016 - 21:24
fonte

Leggi altre domande sui tag