457 Stimmen

Ist es möglich, abstrakte Klassen zu erstellen?

Wie kann ich eine Klasse oder Methode in Python abstrakt machen?

Ich habe versucht, eine neue Definition __new__() etwa so:

class F:
    def __new__(cls):
        raise Exception("Unable to create an instance of abstract class %s" %cls)

Aber wenn ich jetzt eine Klasse erstelle G die erbt von F etwa so:

class G(F):
    pass

Dann kann ich nicht instanziieren G auch nicht, denn sie ruft die Super-Klasse __new__ Methode.

Gibt es eine bessere Möglichkeit, eine abstrakte Klasse zu definieren?

9voto

Rajkumar SR Punkte 107

Dieser wird in Python 3 arbeiten

from abc import ABCMeta, abstractmethod

class Abstract(metaclass=ABCMeta):

    @abstractmethod
    def foo(self):
        pass

Abstract()
>>> TypeError: Can not instantiate abstract class Abstract with abstract methods foo

3voto

Giovanni Angeli Punkte 64

Auch das funktioniert und ist einfach:

class A_abstract(object):

    def __init__(self):
        # quite simple, old-school way.
        if self.__class__.__name__ == "A_abstract": 
            raise NotImplementedError("You can't instantiate this abstract class. Derive it, please.")

class B(A_abstract):

        pass

b = B()

# here an exception is raised:
a = A_abstract()

3voto

Elijah Punkte 186

Sie können auch die Methode __new__ zu Ihrem Vorteil nutzen. Sie haben gerade etwas vergessen. Die __new__-Methode gibt immer das neue Objekt zurück, also müssen Sie die new-Methode der Oberklasse zurückgeben. Gehen Sie wie folgt vor.

class F:
    def __new__(cls):
        if cls is F:
            raise TypeError("Cannot create an instance of abstract class '{}'".format(cls.__name__))
        return super().__new__(cls)

Wenn Sie die Methode new verwenden, müssen Sie das Objekt zurückgeben, nicht das Schlüsselwort None. Das ist alles, was Sie übersehen haben.

3voto

Sean Bradley Punkte 2984

Ich finde die akzeptierte Antwort und alle anderen seltsam, da sie an der self zu einer abstrakten Klasse. Eine abstrakte Klasse wird nicht instanziiert und kann daher keine self .

Probieren Sie das aus, es funktioniert.

from abc import ABCMeta, abstractmethod

class Abstract(metaclass=ABCMeta):
    @staticmethod
    @abstractmethod
    def foo():
        """An abstract method. No need to write pass"""

class Derived(Abstract):
    def foo(self):
        print('Hooray!')

FOO = Derived()
FOO.foo()

3voto

Shivam Bharadwaj Punkte 1554
 from abc import ABCMeta, abstractmethod

 #Abstract class and abstract method declaration
 class Jungle(metaclass=ABCMeta):
     #constructor with default values
     def __init__(self, name="Unknown"):
     self.visitorName = name

     def welcomeMessage(self):
         print("Hello %s , Welcome to the Jungle" % self.visitorName)

     # abstract method is compulsory to defined in child-class
     @abstractmethod
     def scarySound(self):
         pass

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X