Python——检查对象是否是某个模块中任何类的实例

标签 python class types module typechecking

需要一种方法来检查一个对象是否是某个特定模块中任何类的实例。

我知道我可以通过从该模块显式导入每个类并使用元组检查来做到这一点:

from my_module import ClassOne, ClassTwo

>>> isinstance(my_obj, (ClassOne, ClassTwo))
True

但实际上,我从中导入的模块中有大量的类,显式导入它们似乎是不必要的冗长,使用它们来构建一个巨大的元组,并对其进行类型检查。我已经尝试了一些方法来避免这种情况:

import my_module

# Test my_obj against the module itself
>>> isinstance(my_obj, my_module)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

# Try to test against a wildcard attribute on my_module
>>> isinstance(my_obj, my_module.*)
SyntaxError: invalid syntax

#Try to build a tuple of clases with iteration to check against
>>> for klass in my_module:
TypeError: 'module' object is not iterable

有没有一种方法可以对 my_module 中的所有类进行类型检查,而无需在元组中明确命名它们?

可选背景信息:
我可能忽略了解决问题的更好方法——如果您想知道,情况如下:

我们正在将数据从 Google App Engine 应用程序导出到我们在 Rackspace 上托管的应用程序。我们使用 pickle 序列化数据,然后使用 HTTP 请求将其发送到我们的 Rackspace 服务器。

Google App Engine 数据库中的一些数据属于 GAE 特定的数据类型,从 google.appengine.api.datastore_types 导入。如果这些数据类型中的任何一个通过网络连接到我们的 Rackspace 服务器,它们将引发错误 depickling,因为我们的 Rackspace 应用程序没有所需的 GAE 库。因此,在退出 GAE 的过程中,我正在检查是否有任何传出对象具有来自 google.appengine.api.datastore_types 的类型。如果是这样,我要么将它们转换为内置数据类型,要么从对象中删除该字段。

最佳答案

您可以使用 inspect.getmembers获取模块中的所有类:

inspect.getmembers(my_module,inspect.isclass)

这将返回名称-类对的列表。你只想要类(class):

my_module_classes = tuple(x[1] for x in inspect.getmembers(my_module,inspect.isclass))

当我最初写这个答案时,我设法忽略的一件事是检查类的 __module__ 属性的能力。您也许可以检查 __module__ 是否符合您的预期:

from somewhere import module

if getattr(obj, '__module__', None) == module.__name__:
    # obj is from module.

这可能比 isinstance 检查大量类名列表更便宜。

关于Python——检查对象是否是某个模块中任何类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14570802/

相关文章:

java - 在 Java 中设置持续时间的适当方法

c++ - 如何在 C++ 的一个项目中访问所有具有相同类型/类的对象?

python fabric检查hadoop文件是否存在

java - 初始化程序对静态字段的非法引用

java - 我想使用类中的方法设置和获取实例属性

java - 传递多个类( Class<? extends foo> 接口(interface)和抽象类)

dom - 在React组件中关注输入字段–尝试创建引用时出现类型错误

python - (Pyspark - 在一段时间内按用户分组

python - 使用 smtplib 发送邮件时 DKIM 失败

python - 在 Python 3.6+ 中将字符串转换为二进制的更快方法?