這個函數有點類似type函數的定義
type判斷函數類型是什麼,而isinstance是通過判斷對象是否是已知的類型
但是isinstance比type高級一些(功能上的差異)
具體差異:
其基本函數的源碼如下:
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
isinstance(object, classinfo)
object :實例對象
classinfo :類型可以是 直接或間接類名、基本類型以及元組
基礎版的運用:
a = 10086
isinstance (a,int) # true
isinstance (a,str) # false
isinstance (a,(str,int,list)) # 只要滿足元組類型中的其中一個即可,答案是滿足,所以為false
關於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))
結合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'>