确定 Python 类是抽象基类还是具体类 [英] Determine if a Python class is an Abstract Base Class or Concrete

查看:26
本文介绍了确定 Python 类是抽象基类还是具体类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 Python 应用程序包含许多抽象类和实现.例如:

My Python application contains many abstract classes and implementations. For example:

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 is a concrete class that we can use...

FriendlyMessagePrinter().greet()

Good night.

...但是 MessageDisplayFriendlyMessageDisplay 是抽象类,尝试实例化一个会导致错误:

...but MessageDisplay and FriendlyMessageDisplay are abstract classes and attempting to instantiate one would result in an error:

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

如何检查给定的类对象是否是(不可实例化的)抽象类?

How can I check if a given class object is an (uninstantiatable) abstract class?

推荐答案

import inspect
print(inspect.isabstract(object))                  # False
print(inspect.isabstract(MessageDisplay))          # True
print(inspect.isabstract(FriendlyMessageDisplay))  # True
print(inspect.isabstract(FriendlyMessagePrinter))  # False

这会检查内部标志 TPFLAGS_IS_ABSTRACT 是否已在类对象中设置,因此它不会像您的实现一样容易被愚弄:

This checks that the internal flag TPFLAGS_IS_ABSTRACT is set in the class object, so it can't be fooled as easily as your implementation:

class Fake:
    __abstractmethods__ = 'bluh'

print(is_abstract(Fake), inspect.isabstract(Fake)) # True, False

这篇关于确定 Python 类是抽象基类还是具体类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆