pyl*_*ver 12 python class python-2.7
假设一个简单的类:
class MyClass(object):
pass
.
.
.
m = MyClass
print type(m) # gets: <type 'classobj'>
# if m is classobj, how can i check a variable is class object?
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何检查变量是否为类对象?
简单的解决方案:
if str(type(m)) == "<type 'classobj'>":
# do something
Run Code Online (Sandbox Code Playgroud)
但我认为至少有一种经典方法可以检查.
Joc*_*zel 28
使用检查:
import inspect
print inspect.isclass(obj)
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 16
在2.x中,类对象可以是type(新样式类)或classobj(经典类).该type类型是内置的,但classobj类型不是.那么,你怎么得到它?这就是types模块的用途.
isinstance(MyClass, (types.TypeType, types.ClassType))
Run Code Online (Sandbox Code Playgroud)
在3.x中,您不必担心经典类,因此:
isinstance(MyClass, type)
Run Code Online (Sandbox Code Playgroud)
即使您想直接比较类型,也不应该按照它们来比较任何对象str.相比:
>>> class MyClassicClass:
... pass
>>> str(type(MyClassicClass)) == "<type 'classobj'>"
True
>>> str("<type 'classobj'>") == "<type 'classobj'>"
True
Run Code Online (Sandbox Code Playgroud)
您几乎总是可以直接比较对象:
>>> type(MyClassicClass) == types.ClassType
True
>>> "<type 'classobj'>" == types.ClassType
False
Run Code Online (Sandbox Code Playgroud)
(在非常罕见的情况下,你真的需要比较字符串表示由于某种原因,你想要的repr,而不是str.)
新式类(object在您的示例中显式派生自,或在 Python 3 中隐式派生)不是 type classobj。只有旧式的类是classobjs。因此,对于您编写的示例类,您可以简单地检查是否MyClass是 的实例type,因为所有新式类都是:
isinstance(MyClass, type)
Run Code Online (Sandbox Code Playgroud)
因为所有新式类都是从object你派生出来的,你也可以这样做:
issubclass(MyClass, object)
Run Code Online (Sandbox Code Playgroud)
我建议不要:
type(MyClass) == type
Run Code Online (Sandbox Code Playgroud)
如果类的类型不是type,而是元类,这将失败。当然,尽管可能会有用例。
如果您确实需要查看是否有旧式类,则可以导入types模块并使用types.ClassType,或者仅声明一个旧式类并查看您正在测试的类是否属于相同类型:
class OldStyleClass:
pass
OldStyleClass = type(OldStyleClass)
isinstance(MyClass, OldStyleClass)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19737 次 |
| 最近记录: |