最簡單的hash算法,取餘,便於理解模型算法
字典爲了提升查詢效率,使用空間換時間spa
實例的屬性都須要一個空間,裏邊只放一兩個了浪費code
解決數百萬個對象問題,字典就太多了對象
此時就能夠用slots解決,只要定義了__slots__,對象的字典消失blog
__slots__中沒有的屬性,對象不能添加繼承
__slots__中的屬性,能夠在定義對象時先沒有所有屬性內存
嘗試爲實例增長動態屬性時,會失敗,爲類增添類的屬性不受影響。開發
class A: X = 100 __slots__ = ('x', 'y') ##元祖能夠 #__slots__ = ['y','x'] ##列表能夠 #__slots__ = 'y', 'x' ##自動封成元祖 #__slots__ = 'y' def __init__(self): self.x = 5 self.y = 4 def show(self): print(self.X, self.y) a = A() a.show() print("A",A.__dict__) #print('a',a.__dict__)
不影響子類的實例,不會繼承,只對本身的實例的字典生效。節約內存能夠用元組,列表問題也不大文檔
須要構建數百萬的以上的對象,且內存容量較爲緊張時使用。實例的屬性簡單,固定且不用動態增長的場景字符串
在生產中通常不用,知識點,內存受限的開發時,纔會考慮用slots
通常都是多用內存來提升效率,要求時間時,用空間來換
NotImplemented 是個值,是個單值
不是None,文檔是==None,但它不是None
內建對象,未定義的值,本身有類,
類型和繼承是兩條線
__add__,__iadd__ 運算符重載
radd 反向加法,
class A: def __init__(self): self.x = 4 def __add__(self, other): print('A add') if hasattr(other,'x'): return self.x+other.x try: x = int(other) except: x = 0 return self.x + x def __radd__(self, other): print("A radd") return self.__add__(other) class B: def __init__(self): self.x = 2 def __add__(self, other): print('B add') if isinstance(other,type(self)): return self.x + other.x else: return NotImplemented a = A() b = B()
A類的實例實現了加法,B類的實例沒有實現加法,a+b時調用a的__add__方法,b+a時報錯
A類的實例實現了反向加法,b+a時,若是B類沒有加法,就會調用A類的反向加法,B類加法返回NotImplemented,未實現時解釋器會自動調第二對象的__radd__方法
1+a時,1在調用自身的加法後,會判斷第二個值得類型,不是int,就會嘗試調第二個值的__radd__方法,字符串也是同樣的方法。
生成器交互
生成器提供了send方法,能夠和生成器溝通
調用send,就能夠把send的實參傳給yield語句作結果,這個結果能夠在等式右邊被賦值給其餘變量
send和next同樣能夠推進生成器啓動執行
def inc(): count = 0 while True: response = yield count if response: count = response count += 1 g = inc() print(next(g)) print(g.send(5))