Python_对象类型判断

常规类型判断

# 【字符串】类型判断
isinstance("s", str)

# 【浮点数】类型判断
isinstance(3.14, float)

# 【整数型】类型判断
isinstance(66, int)

# 【布尔】类型判断
isinstance(True, bool)

# 【列表】类型判断
isinstance(["a", 1, True], list)

# 【元组】类型判断
isinstance(("b", 1), tuple)

# 【字典】类型判断
isinstance({"a": 1, "b": 2}, dict)

# 【集合】类型判断
isinstance({"a", "b"}, set)

Function&Method类型判断

import types


def func():
    pass

class A(object):

    @classmethod
    def class_method(cls):
        pass

    def method(self):
        pass


print(isinstance(func, types.FunctionType))     # 函数判断
print(isinstance(A.class_method, types.MethodType))     # 方法判断
print(isinstance(A().method, types.MethodType))         # 方法判断
print(isinstance(A.class_method, types.FunctionType))   # 函数的判断类型不能用于方法的判断
print(isinstance(A().method, types.FunctionType))       # 函数的判断类型不能用于方法的判断

class类型判断

python3中判断对象是否是class

class A:
    pass


class B(object):
    pass


print(type(A))
print(type(B))
print(isinstance(A, type))
print(isinstance(B, type))

python2中判断对象是否是class

在Python2中,如果定义的class未继承 object (比如A),那么它的类型是classobj

在python2中未继承object类的class需要使用 types.ClassType 来判定

# coding=utf-8

import types


class A:
    pass


class B(object):
    pass


print(type(A))
print(type(B))
print("不继承object的类A,使用type判断: %s" % isinstance(A, type))
print("继承object的类B,使用type判断:%s"% isinstance(B, type))
print("不继承object的类A,使用types.ClassType判断:%s" % isinstance(A, types.ClassType))
print("继承object的类B,使用types.ClassType判断:%s" % isinstance(B, types.ClassType))

 综上,python2中,class判断应包含两个类型。

# coding=utf-8
import types

class A:
    pass

class B(object):
    pass


print("不继承object的类A,使用types.ClassType判断:%s" % isinstance(A, (type, types.ClassType)))
print("继承object的类B,使用types.ClassType判断:%s" % isinstance(B, (type, types.ClassType)))

判断对象是否是一个已知类或子类的实例化对象。

class A(object):
    pass

class B(A):
    pass

class C(object):
    pass


a = A()
b = B()
c = C()
print(isinstance(a, A))
print(isinstance(b, A))
print(isinstance(C, A))

判断对象是否是一个已知类或是该已知类的子类

此类判断需用 issubclass方法。

class A(object):
    pass

class B(A):
    pass

class C(B):
    pass

class D(object):
    pass


print(issubclass(B, A))
print(issubclass(C, A))
print(issubclass(D, A))

module类型判断

Python的module指的是Python包中以.py结尾的名称,包含了 Python 对象定义和Python语句。

module类型判断指的是import 的最后个节点导入的是modulle

import types
from settings import base_conf    # 导入最后给节点为module

ret = isinstance(base_conf, types.ModuleType)
print(ret)

扩展:区分module是package还是py文件

注意:如果导入的最后个节点如果是package名称,但是类型判断结果仍是module类型。这是因为导入package时,实际实际导入的是该package下的__init__.py

import types

from settings import base_conf
ret = isinstance(base_conf, types.ModuleType)
print("导入py文件名称的module类型判断:", ret)
print(base_conf.__file__)

import settings
ret = isinstance(settings, types.ModuleType)
print("导入package的module类型判断:", ret)
print(settings.__file__)

通过dir()方法查看两种对象属性差异

import settings
from settings import base_conf

print("settings:", dir(settings))
print("base_conf:", dir(base_conf))

package比py文件module多个__path__属性,可以使用该区分module的不同类型

import types

import settings
from settings import base_conf


for mod in [settings, base_conf]:
    if isinstance(mod, types.ModuleType):
        if hasattr(mod, '__path__'):
            print("模块 %s 是package!" % mod.__name__)
        else:
            print("模块 %s 是py文件" % mod.__name__)

 

posted @ 2021-12-20 15:47  码上测  阅读(1007)  评论(0编辑  收藏  举报