Ops*_*psa 15 python python-3.x
要确定课程,我可以这样做:
class A: pass
a = A
type(A) is type #True
Run Code Online (Sandbox Code Playgroud)
要么:
import inspect
inspect.isclass(A)
Run Code Online (Sandbox Code Playgroud)
但是如何确定类实例的类型,不知道类名?
像这样的东西:
isinstance(a, a.__class__.__name__)
#TypeError: isinstance() arg 2 must be a type or tuple of types
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方案,但它不适用于Python 3x
import types
class A: pass
a = A()
print(type(a) == types.InstanceType)
#AttributeError: 'module' object has no attribute 'InstanceType'
Run Code Online (Sandbox Code Playgroud)
解:
if '__dict__' in dir(a) and type(a) is not type:
Run Code Online (Sandbox Code Playgroud)
Len*_*bro 20
你的问题有点不清楚.您想确定"类实例的类型".这可能意味着两件事.您要么确定实例是特定类的实例.你可以这样做:
>>> isinstance(a, A)
True
Run Code Online (Sandbox Code Playgroud)
您也可以通过type()调用获取类,但这通常不是很有用:
>>> type(a)
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)
但是你展示的测试不会检查这个.相反,他们检查班级的类型.但是Python 3只有一种类型.Python 2以及"旧式"和"新式"类,但Python 3只有新式类,所以不需要在Python 3中进行这种检查.
您也可以使用元类.在这种情况下,您可以通过检查类的类来找到元类__class__:
>>> from abc import ABCMeta
>>> class B(metaclass=ABCMeta): pass
>>> type(B)
<class 'abc.ABCMeta'>
Run Code Online (Sandbox Code Playgroud)
但是,从您的评论中,您似乎想要确定对象是否是实例.如果你问的话,你会得到更好的答案......
无论如何,要做到这一点,你使用inspect.isclass:
>>> import inspect
>>> inspect.isclass(a)
False
>>> inspect.isclass(A)
True
Run Code Online (Sandbox Code Playgroud)
这是因为一切都是一个实例:
>>> isinstance(type, type)
True
Run Code Online (Sandbox Code Playgroud)
但并非一切都是一个阶级.
kin*_*all 16
type(a)是实例的类型,即它的类. a.__class__也是对实例类的引用,但您应该使用type(a).
types.InstanceType仅适用于Python 3.0之前版本的旧式类,其中所有实例都具有相同的类型.您应该object在2.x中使用新式类(派生自).在Python 3.0中,所有类都是新式类.
| 归档时间: |
|
| 查看次数: |
37265 次 |
| 最近记录: |