有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。
我可以检查对象不是类,不是模块,也不是追溯等,但是我对简单的解决方案感兴趣。
有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。
我可以检查对象不是类,不是模块,也不是追溯等,但是我对简单的解决方案感兴趣。
from my_module import MyClass
将是类对象,而不是类的实例,则类似地用于回溯,函数,模块。inspect
模块包含针对此类对象的特殊检查功能,但不包含针对类实例的功能。大概来说,我想检测所有print obj
要打印的对象<instance of ...>
(如果没有为类定义特殊的打印)
type
但是任何人都可以定义一个元类,即使没有继承自,也可以定义IIRC type
)。追溯只是的一个实例traceback
。函数只是的一个实例function
。方法也只是类的实例(这取决于您对方法的确切理解)。您必须更加具体-甚至更好,只需告诉我们您的实际问题。
Answers:
isinstance()
是你的朋友在这里。它返回一个布尔值,可以按以下方式用于检查类型。
if isinstance(obj, (int, long, float, complex)):
print obj, "is a built-in number type"
if isinstance(obj, MyClass):
print obj, "is of type MyClass"
希望这可以帮助。
isinstance(MyClass_instance, object) == true
。
isinstance(MyClass, type)
返回True,而isinstance(MyClass(), type)
返回False。双方isinstance(MyClass, object)
并isinstance(MyClass(), object)
返回True。具有类型的Isinstance似乎是唯一可行的方法
您是否尝试过isinstance()
内置功能?
您还hasattr(obj, '__class__')
可以查看是否从某种类类型实例化了该对象。
isinstance(obj,FooBar)
我不能写类似的东西isinstance(obj)
isinstance(obj, object)
在我们的层次结构中又是什么呢?正如其他人ponted我们,一切都在Python是一些类,包括数字,回溯,异常等的实例
hasattr(obj, '__class__')
,我尝试过的所有类型的变量始终都是正确的。也许__name__
最好检查一下。
class test(object): pass
type(test)
退货
<type 'type'>
instance = test()
type(instance)
退货
<class '__main__.test'>
因此,这是区分它们的一种方法。
def is_instance(obj):
import inspect, types
if not hasattr(obj, '__dict__'):
return False
if inspect.isroutine(obj):
return False
if type(obj) == types.TypeType: # alternatively inspect.isclass(obj)
# class type
return False
else:
return True
我迟到了。无论如何认为这应该工作。
is_class = hasattr(obj, '__name__')
__name__
,但函数有。
我想我在这件事上很晚了,事实上却在同一个问题上挣扎。所以这对我有用。
>>> class A:
... pass
...
>>> obj = A()
>>> hasattr(obj, '__dict__')
True
>>> hasattr((1,2), '__dict__')
False
>>> hasattr(['a', 'b', 1], '__dict__')
False
>>> hasattr({'a':1, 'b':2}, '__dict__')
False
>>> hasattr({'a', 'b'}, '__dict__')
False
>>> hasattr(2, '__dict__')
False
>>> hasattr('hello', '__dict__')
False
>>> hasattr(2.5, '__dict__')
False
>>>
我在python 3和2.7上都对此进行了测试。
很难说出您想要什么,但是也许inspect.isclass(val)
您正在寻找什么?
from MyModule import MyClass
和a = MyClass()
inspect.isclass(MyClass)
return True
,但inspect.isclass(a)
返回False
。
这是一个肮脏的把戏。
if str(type(this_object)) == "<type 'instance'>":
print "yes it is"
else:
print "no it isn't"
class MyClass(object)
不会返回"<type 'instance'>"
but "<class 'MyClass'>"
,因此您必须添加s.startswith("<class ")
条件。
有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。
我可以检查对象不是类,不是模块,也不是追溯等,但是我对简单的解决方案感兴趣。
就像您在问题中描述的那样,一种方法是一种排除过程,检查它是否不是您想要的。我们检查它是类,模块,回溯,异常还是函数。如果是,则它不是类实例。否则,我们将返回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非正式地做到了这一点) )
我们可以改善这个
最近不得不处理类似的事情。
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
。