2017-10-13 1 views
0

abc benutzen, kann ich abstrakte Klassen erstellen folgendes mit:Wie erstellt man abstrakte Klassen mit ABC, ohne eine abstrakte Methode zu verwenden?

from abc import ABC, abstractmethod 
class A(ABC): 
    @abstractmethod 
    def foo(self): 
     print('foo') 
class B(A): 
    pass 

obj = B() 

Dies wird fehlschlagen, da B nicht die Methode foo definiert hat. Dies ahmt die abstrakte Methodenfunktionalität in Java nach.

Ich wollte wissen, ob die abstrakte Klassenfunktionalität auch in Python vorhanden ist, wo die Instantiierung einer Klasse ohne abstrakte Methoden verhindert wird.

+0

Ich bekomme Ihre Frage nicht. Was meinst du damit, wo die Instanziierung einer Klasse verhindert wird, ohne abstrakte Methoden zu haben? Sie möchten die Klasse selbst implementieren, um abstrakte Methoden zu implementieren? – Vinny

+0

In Java sind abstrakte Methoden und abstrakte Klassen zwei verschiedene Konzepte. Abstrakte Methoden sollten von den Unterklassen definiert werden und abstrakte Klassen können nicht instanziiert werden. Aber im Abc-Modul von Python (nach meinem Verständnis) sind beide miteinander verbunden. Gibt es eine Möglichkeit, eine abstrakte Klasse zu definieren, ohne irgendwelche Methoden als abstrakte Methoden zu dekorieren? –

Antwort

0

Eine einfache Art und Weise Initalizing eine abstrakte Klasse zu verhindern ist:

class Abs(object): 
    def __init__(self, *args, **kwargs): 
     raise NotImplementedError('abstract class can not be initalized') 

    def some_func(self): 
     raise NotImplementedError 

Dies wird eine Ausnahme mit informativer Nachricht erhöhen und Ihre Klasse nicht zulassen, initialisiert werden. Subclassing ist notwendig, um eine Instanz eines solchen Objekts zu erstellen.

Das Verfahren ist ein abstraktes zu:

[...] In Benutzerklassen Basis definiert, abstrakte Methoden sollte erhöhen diese Ausnahme, wenn sie Klassen Überschreibung der Methode abgeleitet erfordern, oder während die Klasse entwickelt wird, um anzuzeigen, dass die reale Implementierung noch hinzugefügt werden muss.

Das ist eine andere Möglichkeit, eine Methode als abstrakt zu deklarieren. Der Unterschied ist @abstractmethod wird TypeError: Can't instantiate abstract class B with abstract methods foo erhöhen, wenn Klasse B die foo-Methode nicht überschrieben hat, während raise NotImplementedError nur bei Ausführung fehlschlägt, und nicht wenn das Instanzobjekt erstellt wird.

0

Die herkömmliche Methode zum Erstellen einer abstrakten Klasse in Python ist das Erhöhen der integrierten Ausnahme NotImplementedError.

class A(object): 
    def __init__(self): 
     raise NotImplementedError('abstract base class') 

class B(A): 
    def __init__(self): 
     # don't call A.__init__ here. 
     pass 

b = B() 
# a = A() # This will fail. 
Verwandte Themen