如果使用 old style class 的风格,可以这样判断:
class A:
pass
a = A()
isinstance(a, types.InstanceType) # true
但是使用 new style class 的话,上述方法无法使用。那么,需要怎样判断呢?
1
knightdf 2015-06-02 15:29:42 +08:00
isinstance(a,A)
|
2
yangtukun1412 OP |
3
knightdf 2015-06-02 17:25:01 +08:00
@yangtukun1412 那在Python里面a必然是一个“类”的实例,不用判断,有意义?
|
4
ruoyu0088 2015-06-02 20:49:42 +08:00
请详细说明你为了实现什么目标而需要判断非 builtin类?非 builtin类的定义是什么?types模块中之外的类都可以认为是非 builtin类吗?
|
5
yangtukun1412 OP |
6
yangtukun1412 OP @ruoyu0088
是的,可以认为 types 模块之外的都算。 目前的问题是发现公司旧代码中有个方法需要对传入的对象进行操作,大致的逻辑是这样的: ```Python def func(obj): if isinstance(obj, types.InstanceType): do_something() else: do_others() ``` 这样当使用 new style class 时,会执行错误的逻辑,需要修改。所以需要一个相对简单的判断方法... |
7
yangtukun1412 OP 原来回复里不支持 md 啊...而且空格的缩进居然也被吃了...
|
8
ruoyu0088 2015-06-03 18:33:24 +08:00 1
把types中的所有类型的id做成一个集合,然后判断你的对象的type的id是否在这个集合之内:
import types builtin_types_id = set(id(obj) for obj in types.__dict__.itervalues() if isinstance(obj, type) and obj is not types.InstanceType) is_buildin = lambda obj:id(type(obj)) in builtin_types_id assert is_buildin(1) assert is_buildin(is_buildin.func_code) assert is_buildin(is_buildin.func_closure) assert is_buildin(is_buildin) assert is_buildin(object()) assert is_buildin([1,2,3]) assert is_buildin(types) assert is_buildin(list) class A(object): pass class B: pass assert not is_buildin(A()) assert not is_buildin(B()) |
9
yangtukun1412 OP |