Python检查类的实例

145

有没有办法检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。

我可以检查一个对象不是类、不是模块、不是回溯等等,但我对一个简单的解决方案感兴趣。


8
每个 Python 对象都是某个类(内置或自定义)的实例。 - StoryTeller - Unslander Monica
2
因此,解决方案是函数 def isobject(x): return True。 - Emanuele Paolini
如果我编写from my_module import MyClass,将会得到类对象,而不是类的实例对象;类似地,对于traceback、函数和模块也是如此。inspect 模块包含用于检查这些类型对象的特殊函数,但没有针对类的实例对象的函数。大致上,我想要检测所有对象,对于这些对象 print obj 将会打印 <instance of ...>(如果没有为该类定义特殊的打印形式)。 - exbluesbreaker
一个类只是另一个类的实例(当区分重要时称为元类;通常为type,但任何人都可以定义元类,即使不继承自type)。回溯(traceback)只是traceback的一个实例。函数只是function的一个实例。方法也只是一个类的实例(这取决于你对方法的确切理解)。你需要更具体的说明——或者更好的办法是,告诉我们您的实际问题。 - user395760
12个回答

1
有没有办法检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。 我可以检查对象不是类、不是模块、不是回溯等等,但我对一个简单的解决方案感兴趣。
一种方法就像你在问题中描述的那样,是一个排除的过程,检查它是否不是你想要的。我们检查它是否是一个类、一个模块、一个回溯、一个异常或一个函数。如果是,那么它不是一个类的实例。否则,我们返回True,在某些情况下这可能有用,另外我们也建立了一系列小助手的库。
以下是一些代码,它定义了一组类型检查器,然后将它们组合起来排除我们不关心的各种东西。
from types import (
    BuiltinFunctionType,
    BuiltinMethodType,
    FunctionType,
    MethodType,
    LambdaType,
    ModuleType,
    TracebackType,
)
from functools import partial
from toolz import curry
import inspect
    
def isfunction(variable: any) -> bool:
    return isinstance(
        variable,
        (
            BuiltinFunctionType,
            BuiltinMethodType,
            FunctionType,
            MethodType,
            LambdaType,
            partial,
            curry
        ),
    )
    
isclass = inspect.isclass
    
def ismodule(variable: any) -> bool:
   return isinstance(variable, ModuleType)
    
    
def isexception(variable: any) -> bool:
    return isinstance(variable, Exception)
    
    
def istraceback(variable: any) -> bool:
    return isinstance(variable, TracebackType)
    
    
def isclassinstance(x: any) -> bool:
    if isfunction(x) or isclass(x) or ismodule(x) or istraceback(x) or isexception(x):
        return False
    return True

记住,从一个非常抽象的角度看,一切都是一件事情,甚至包括事物或功能的类别...但从实际角度来看,这可能有助于避免将MyClass误认为my_class_instance(Python社区也以PascalCase vs snake_case的非正式方式进行此操作)。
我们可以改进这个。

0

最近也遇到了类似的问题。

import inspect

class A:
    pass

def func():
    pass

instance_a = A()

def is_object(obj):
     return inspect.isclass(type(obj)) and not type(obj) == type

is_object(A)          # False
is_object(func)       # False
is_object(instance_a) # True

2
在我的Python(2.7.12)中,无论如何inspect.isclass(type(a))始终返回true,这也适用于你的函数is_object - Youda008
@Youda008,你说得对。这段代码有缺陷。是个棘手的问题。 - Ben Hoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接