
Python 常用内置函数详解(一):isinstance()函数----判断对象是否是类或子类
·
一、功能
isinstance() 函数用于判断对象是否是类或者类型元组中任意类元素的实例。
二、语法和示例
语法结构如下:
isinstance(object, classinfo)
# ① object:实例对象
# ② classinfo:类名可以是直接或间接类名、基本类型或者由它们组成的元组
# ③ 返回值:如果对象的类型与classinfo类型相同则返回True;否则返回False
【示例1】使用isinstance()函数判断一个实例对象是否属于某个类。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2023-10-30 23:34
# @Author : AmoXiang
# @File : 01-IsinstanceTest.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
class Animals(object):
a = ['dog', 'cat', 'pig', 'elephant', 'fox']
animal_instance = Animals()
print(isinstance(animal_instance, Animals)) # 判断是否为Animals类的实例
print(isinstance(animal_instance, tuple)) # 判断是否为元组
print(isinstance(animal_instance, (list, tuple, Animals))) # 判断是否为列表,元组或者Animals类的实例
程序运行结果如下图所示:
【示例2】使用isinstance()函数判断某个对象是否属于原生类型,代码如下:
# -*- coding: utf-8 -*-
# @Time : 2023-10-30 23:34
# @Author : AmoXiang
# @File : 01-IsinstanceTest.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
numbers = [6, 7, 8, 9]
result = isinstance(numbers, list)
print(f'{numbers} isinstance of list? {result}')
result = isinstance(numbers, dict) # 判断是否为字典
print(f'{numbers} isinstance of dict? {result}')
result = isinstance(numbers, (dict, list)) # 判断是否为字典或列表
print(f'{numbers} isinstance of dict or list? {result}')
number = 5
result = isinstance(number, list)
print(f'{number} isinstance of list? {result}')
result = isinstance(number, int)
print(f'{number} isinstance of int? {result}')
程序运行结果如下图所示:
【示例3】判断多个继承中实例和父类的关系。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2023-10-30 23:34
# @Author : AmoXiang
# @File : 01-IsinstanceTest.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
# 示例3:
class A:
pass
class B(A):
pass
class C(B):
pass
some_instance = C()
if isinstance(some_instance, A): # 判断实例是否属于A
print(f'{some_instance} 属于A的实例')
else:
print(f'{some_instance} 不属于A的实例')
程序运行结果如下图所示:
【示例4】将字典转化为JSON格式。判断数据是否为字典类型,如果实字典,则将字典转换为JSON格式,否则提示格式错误。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2023-10-30 23:34
# @Author : AmoXiang
# @File : 01-IsinstanceTest.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
import json
# 示例4:
def set_page_config(data):
if isinstance(data, dict):
data = json.dumps(data) # 将字典转化为JSON格式数据
return data
else:
return '类型错误'
dict_data = {'app_id': '123456', 'app_name': 'Student'}
print(f'{dict_data} 数据类型是: {type(dict_data)}')
print(f'转化后的JSON格式数据是: {set_page_config(dict_data)}')
print('*' * 70)
list_data = ['123456', 'Student']
print(f'{list_data} 数据类型是: {type(list_data)}')
print(set_page_config(list_data))
程序运行结果如下图所示:
【示例5】将不同的日期格式转换为datetime.date格式。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2024-09-03 0:05
# @Author : AmoXiang
# @File: isinstance_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
import datetime
import time
def get_date(date=None):
"""返回`datetime.date`实例"""
if date is None:
# use current value
return datetime.date.today()
if isinstance(date, datetime.date):
return date
if isinstance(date, datetime.datetime):
return date.date()
if isinstance(date, (int, float)):
# date是时间戳
return datetime.date.fromtimestamp(date)
if isinstance(date, str):
# date是字符串形式
date = date.replace(" ", "0")
if len(date) == 6:
# yymmdd
return datetime.date(*time.strptime(date, "%y%m%d")[:3])
# yyyymmdd
return datetime.date(*time.strptime(date, "%Y%m%d")[:3])
if hasattr(date, "__getitem__"):
# a sequence (assuming date/time tuple)
return datetime.date(*date[:3])
return datetime.date.fromtimestamp(date.ticks())
print(get_date()) # 没有参数默认获取当前日期
print(get_date('20240903')) # 字符串格式
print(get_date(1725293303)) # 时间戳格式
print(get_date(datetime.date(2024, 9, 3))) # datetime.date格式
print(get_date(datetime.datetime(2024, 9, 3, 0, 7))) # datetime.datetime格式
三、补充:issubclass()函数—判断是否是其他类的子类
issubclass() 函数用于判断类是否是另外一个类或者类型元组中任意类元素的子类。
class:类名,用于指定子类
classinfo:类名,用于指定父类
返回值:如果 class 是 classinfo 的子类返回 True,否则返回 False
# -*- coding: utf-8 -*-
# @Time : 2023-10-31 0:14
# @Author : AmoXiang
# @File : 02-IssubclassTest.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
# 示例1: 判断类的继承关系
class A:
pass
class B(A):
pass
if issubclass(B, A):
print('B是A的子类') # 输出结果: B是A的子类
else:
print('B不是A的子类')
# 示例2:判断多个继承中父类和子类的关系
class C(B):
pass
if issubclass(C, A):
print('C是A的子类')
else:
print('C不是A的子类')
print(issubclass(C, A))
print(issubclass(B, (A, C))) # 判断B是A或C的子类
程序运行结果如下图所示:
其他示例:
# -*- coding: utf-8 -*-
# @Time : 2024-09-03 0:10
# @Author : AmoXiang
# @File: issubclass_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680
# 判断布尔型和整型之间的关系
print(int(False))
print(int(True))
print(True + True)
print(issubclass(bool, int)) # True
# 获取模块内所有子类的特定属性值
__all__ = ["lookupFor", ] # 所有类都追到__all__变量
# 定义抽象类
class DbfFieldDef(object):
pass
# 定义子类
class DbfCharacterFieldDef(DbfFieldDef):
typeCode = "C"
class DbfNumericFieldDef(DbfFieldDef):
typeCode = "N"
class DbfFloatFieldDef(DbfNumericFieldDef):
typeCode = "F"
class DbfIntegerFieldDef(DbfFieldDef):
typeCode = "I"
class DbfCurrencyFieldDef(DbfFieldDef):
typeCode = "Y"
class DbfLogicalFieldDef(DbfFieldDef):
typeCode = "L"
class DbfMemoFieldDef(DbfFieldDef):
typeCode = "M"
class DbfDateFieldDef(DbfFieldDef):
typeCode = "D"
class DbfDateTimeFieldDef(DbfFieldDef):
typeCode = "T"
_fieldsRegistry = {} # 初始化字典
def register_field(field_cls):
assert field_cls.typeCode is not None, "Type code isn't defined"
_fieldsRegistry[field_cls.typeCode] = field_cls
def lookup_for(type_code):
return _fieldsRegistry[chr(type_code)]
# 注册一般类型
for (_name, _val) in list(globals().items()):
if isinstance(_val, type) and issubclass(_val, DbfFieldDef) and (_name != "DbfFieldDef"):
__all__.append(_name)
register_field(_val)
del _name, _val # 删除属性
print(_fieldsRegistry)
更多推荐
所有评论(0)