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__)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM