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?