有没有办法检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。
我可以检查一个对象不是类、不是模块、不是回溯等等,但我对一个简单的解决方案感兴趣。
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
最近也遇到了类似的问题。
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
inspect.isclass(type(a))
始终返回true,这也适用于你的函数is_object
。 - Youda008
from my_module import MyClass
,将会得到类对象,而不是类的实例对象;类似地,对于traceback、函数和模块也是如此。inspect
模块包含用于检查这些类型对象的特殊函数,但没有针对类的实例对象的函数。大致上,我想要检测所有对象,对于这些对象print obj
将会打印<instance of ...>
(如果没有为该类定义特殊的打印形式)。 - exbluesbreakertype
,但任何人都可以定义元类,即使不继承自type
)。回溯(traceback)只是traceback
的一个实例。函数只是function
的一个实例。方法也只是一个类的实例(这取决于你对方法的确切理解)。你需要更具体的说明——或者更好的办法是,告诉我们您的实际问题。 - user395760