前言
这个函数有点类似type函数的定义
type判断函数类型是什么,而isinstance是通过判断对象是否是已知的类型
但是isinstance比type高级一些(功能上的差异)
具体差异:
type()
:不考虑继承关系(子类不是父类类型)isinstance()
:考虑继承关系(子类是父类类型)
1. 基本语法
其基本函数的源码如下:
def isinstance(x, A_tuple): # real signature unknown; restored from __doc__
"""
Return whether an object is an instance of a class or of a subclass thereof.
A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
or ...`` etc.
"""
pass
参数:
object
:实例对象classinfo
:类型可以是 直接或间接类名、基本类型以及元组
2. 函数运用
基础版的运用:
a = 10086
isinstance (a,int) # true
isinstance (a,str) # false
isinstance (a,(str,int,list)) # 只要满足元组类型中的其中一个即可,答案是满足,所以为true
关于python的数据类型具体有哪些
可查看我之前的文章:python数据类型详细分析(附代码)
高阶版运用:
s = () # 定义一个元组类型
isinstance(s,tuple) # true
isinstance(s,list) # false
s1 = [] # 定义一个列表类型
isinstance(s1,list) # true
s2 = {} # 定义一个字典类型
isinstance(s2,dict) # true
# 混合类型判断,通过for索引取值判断
isinstance(s,(tuple,list,dict))
3. Demo
一、 基本语法:
class A:
pass
class B(A):
pass
obj1 = A()
obj2 = B()
print(isinstance(obj1, A)) # True
print(isinstance(obj1, B)) # False
print(isinstance(obj2, A)) # True
print(isinstance(obj2, B)) # True
二、类型元组:
x = 5
print(isinstance(x, (int, float))) # True
print(isinstance(x, (str, list))) # False
三、处理多态:
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
def animal_sound(animal):
if isinstance(animal, Animal):
return animal.speak()
else:
return "Not a valid animal"
dog = Dog()
cat = Cat()
print(animal_sound(dog)) # Woof!
print(animal_sound(cat)) # Meow!
print(animal_sound("rabbit")) # Not a valid animal
4. 实战
结合python的web开发
定义一个字段来获取字段值
@python_2_unicode_compatible
class xx(Document):
name = StringField(required=False, help_text=u"名字")
age = StringField(required=False, help_text=u"年龄")
# 日志中显示的字段
_show_log = ('name', 'age')
def __str__(self):
return u"码农研究僧的名字:{name1},年龄:{name2}".format(name1=self.name,name2=self.age)
关于format的函数可看我之前的文章:python中format格式化函数(全)
通过@log日志注解来获取
@log('addition')
def yy(name,age):
project = AudioBlack(name,age)
。。。
return project
在log日志的注解中定义如下:(伪代码)
def log(operation=''):
def _decorate(func):
@wraps(func)
def _wraps(*args, **kwargs):
x, y = kwargs.pop('log', True), kwargs.pop('operator', None)
z = func(*args, **kwargs)
# 默认记录日志
if isinstance(z, (Document)) and x and y:
。。。。
return z
return _wraps
return _decorate
大致逻辑如下:
在某个地方专门调用yy这个函数,yy这个函数通过注解触发日志,之后通过调用xx这个类(这些都是开发的内容)
回归今天的重点:
log日志内部中有一个if isinstance(z, (Document))
函数
输出如下:<class 'projects.models.project.xx'>