我的Python应用程序包含许多抽象类和实现。例如:
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
是一个具体的类,我们可以使用它。。。
FriendlyMessagePrinter().greet()
Good night.
…但是MessageDisplay
和FriendlyMessageDisplay
是抽象类,试图实例化一个类将导致错误:
TypeError: Can't instantiate abstract class MessageDisplay with abstract methods say
如何检查给定的类对象是否是(不可实例化的)抽象类?
这将检查是否在类对象中设置了内部标志
TPFLAGS_IS_ABSTRACT
,因此它不会像您的实现那样容易被愚弄:抽象类及其具体实现有一个
__abstractmethods__
属性,其中包含尚未实现的抽象方法和属性的名称。此行为在PEP 3199中描述:所以在具体的类中,这个属性要么不存在,要么是一个空集。这很容易检查:
或者更简洁地说:
您可以使用
_ast
模块来完成此操作。例如,如果示例代码位于foo.py
中,则可以使用"foo.py"
和"FriendlyMessagePrinter"
作为参数调用此函数。相关问题 更多 >
编程相关推荐