一:內置函數(一顆星)python
isinstance(obj,cls)檢查是否obj是不是類 cls 的對象函數
實例化一個對象,而後判斷對象是否是在類裏面spa
class Foo(object): pass obj = Foo() print(isinstance(obj, Foo))
issubclass(sub, super)檢查sub類是不是 super 類的派生類 orm
兩個類之間,判讀子類是否是父類派生類對象
class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar, Foo))
二: python面向對象中的反射:經過字符串的形式操做對象相關的屬性。python中的一切事物都是對象(均可以使用反射)utf-8
四個能夠實現自省的函數(hasattr,getattr,delattr,setattr)字符串
下列方法適用於類和對象(一切皆對象,類自己也是一個對象)get
也就是這些內置函數源碼()源碼
def hasattr(*args, **kwargs): # real signature unknown """ Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass
class Foo: f='類的靜態屬性' def __init__(self,name,age): self.name=name self.age=age def say(self): print('hi,%s'%self.name) obj=Foo('egon',23)#obj是對象名 #檢查類是否含有默寫屬性 hasattr # print(hasattr(obj,'name'))#對象名,屬性名 # print(hasattr(obj,'say'))#對象名,類中方法名 # # #獲取類中屬性 getattr # # 賦值 # n=getattr(obj,'age') #對象名,屬性名 # print(n) # # 直接打印 # print(getattr(obj,'age')) # # 賦值一個函數名, # func=getattr(obj,'say') # func()#直接用函數名調用 # 設置屬性 # print(setattr(obj,'sb',True)) # print(setattr(obj,'show_name',lambda self:self.name+'sb')) # print(obj.sb) # print(obj.show_name(obj))#人打狗同樣對象.方法(對象) # 刪除屬性 # print(delattr(obj,'age')) # print(delattr(Foo,'say')) # print(obj.__dict__) # 一切皆對象 # class Foo(): # staticField = "old boy" # def __init__(self): # self.name = 'wupeiqi' # def func(): # return 'func' # @staticmethod #裝飾一個不須要self參數函數,也不須要cls參數 # def bar(): #括號裏沒有值 # return 'bar' # # # print(getattr(Foo, 'staticField')) # print(getattr(Foo, 'func')()) #對象.方法(對象) 類也是一個對象 # print(getattr(Foo, 'bar')()) 解讀: 改變對象的字符串顯示__str__,__repr__ 自定製格式化字符串__format__ #_*_coding:utf-8_*_ format_dict={ 'nat':'{obj.name}-{obj.addr}-{obj.type}',#學校名-學校地址-學校類型 'tna':'{obj.type}:{obj.name}:{obj.addr}',#學校類型:學校名:學校地址 'tan':'{obj.type}/{obj.addr}/{obj.name}',#學校類型/學校地址/學校名 } class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __repr__(self): return 'School(%s,%s)' %(self.name,self.addr) #類(格式化,self.name)(屬性名) def __str__(self): return '(%s,%s)' %(self.name,self.addr)#類(格式化,self.name (屬性名) def __format__(self, format_spec): # if format_spec if not format_spec or format_spec not in format_dict: format_spec='nat' fmt=format_dict[format_spec] return fmt.format(obj=self) s1=School('oldboy1','北京','私立') print('from repr: ',repr(s1)) print('from str: ',str(s1)) print(s1) ''' str函數或者print函數--->obj.__str__() repr或者交互式解釋器--->obj.__repr__() 若是__str__沒有被定義,那麼就會使用__repr__來代替輸出 注意:這倆方法的返回值必須是字符串,不然拋出異常 ''' print(format(s1,'nat')) print(format(s1,'tna')) print(format(s1,'tan')) print(format(s1,'asfdasdffd'))
跟格式化format用法相似it