Bestimmen Sie, ob eine Python-Klasse eine abstrakte Basisklasse oder eine konkrete Klasse ist

Meine Python-Anwendung enthält viele abstrakte Klassen und Implementierungen. Zum Beispiel:

import abc
import datetime

class MessageDisplay(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractproperty
    def display(self, message):
        pass

class FriendlyMessageDisplay(MessageDisplay):
    def greet(self):
        hour = datetime.datetime.now().timetuple().tm_hour

        if hour < 7:
            raise Exception("Cannot greet while asleep.")
        elif hour < 12:
            self.display("Good morning!")
        elif hour < 18:
            self.display("Good afternoon!")
        elif hour < 20:
            self.display("Good evening!")
        else:
            self.display("Good night.")

class FriendlyMessagePrinter(FriendlyMessageDisplay):
    def display(self, message):
        print(message)

FriendlyMessagePrinter ist eine konkrete Klasse, die wir verwenden können ...

FriendlyMessagePrinter().greet()
Good night.

...aberMessageDisplay undFriendlyMessageDisplay sind abstrakte Klassen und der Versuch, eine zu instanziieren, würde zu einem Fehler führen:

TypeError: Can't instantiate abstract class MessageDisplay with abstract methods say

Wie kann ich überprüfen, ob ein bestimmtes Klassenobjekt eine (nicht konstante) abstrakte Klasse ist?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage