面向對象進階(day7)
阿新 • • 發佈:2018-01-29
計算機 code 成績 就是 函數 但是 lam one 證明
一、isinstance(obj,cls)和issubclass(sub,super)
1、isinstance(obj,cls)檢查是否obj是否是類 cls 的對象
class Foo(object):
pass
obj = Foo()
isinstance(obj, Foo)
2、issubclass(sub, super)檢查sub類是否是 super 類的派生類
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo)
二、反射
1、什麽是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所采用,並在Lisp和面向對象方面取得了成績。
2、python面向對象中的反射
1)通過字符串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)
四個可以實現自省的函數(下列方法適用於類和對象(一切皆對象,類本身也是一個對象))
(1)hasattr(object,name)
判斷object中有沒有一個name字符串對應的方法或屬性
(2)getattr(object, name, default=None)
獲取object中的屬性
(3)setattr(x, y, v)
設置object中的屬性
(4)delattr(x, y)
刪除object中的屬性
2)四個方法的使用演示
class BlackMedium:
feature=‘Ugly‘
def __init__(self,name,addr):
self.name=name
self.addr=addr
def sell_house(self):
print(‘%s 黑中介賣房子啦,×××才買呢,但是誰能證明自己不××ב %self.name)
def rent_house(self):
print(‘%s 黑中介租房子啦,×××才租呢‘ %self.name)
b1=BlackMedium(‘萬成置地‘,‘回龍觀天露園‘)
#檢測是否含有某屬性
print(hasattr(b1,‘name‘))
print(hasattr(b1,‘sell_house‘))
#獲取屬性
n=getattr(b1,‘name‘)
print(n)
func=getattr(b1,‘rent_house‘)
func()
# getattr(b1,‘aaaaaaaa‘) #報錯
print(getattr(b1,‘aaaaaaaa‘,‘不存在啊‘))
#設置屬性
setattr(b1,‘sb‘,True)
setattr(b1,‘show_name‘,lambda self:self.name+‘sb‘)
print(b1.__dict__)
print(b1.show_name(b1))
#刪除屬性
delattr(b1,‘addr‘)
delattr(b1,‘show_name‘)
delattr(b1,‘show_name111‘) #不存在,則報錯
print(b1.__dict__)
3)類也是對象
class Foo(object):
staticField = "old boy"
def __init__(self):
self.name = ‘wupeiqi‘
def func(self):
return ‘func‘
@staticmethod
def bar():
return ‘bar‘
print getattr(Foo, ‘staticField‘)
print getattr(Foo, ‘func‘)
print getattr(Foo, ‘bar‘)
4)反射當前模塊成員
import sys
def s1():
print ‘s1‘
def s2():
print ‘s2‘
this_module = sys.modules[__name__]
hasattr(this_module, ‘s1‘)
getattr(this_module, ‘s2‘)
3、為什麽用反射之反射的好處
好處一:實現可插拔機制
有倆程序員,一個lili,一個是egon,lili在寫程序的時候需要用到egon所寫的類,但是egon去跟女朋友度蜜月去了,還沒有完成他寫的類,lili想到了反射,使用了反射機制lili可以繼續完成自己的代碼,等egon度蜜月回來後再繼續完成類的定義並且去實現lili想要的功能。
總之反射的好處就是,可以事先定義好接口,接口只有在被完成後才會真正執行,這實現了即插即用,這其實是一種‘後期綁定’,什麽意思?即你可以事先把主要的邏輯寫好(只定義接口),然後後期再去實現接口的功能
好處二:動態導入模塊(基於反射當前模塊成員)
面向對象進階(day7)