chapter10.2基礎知識點補充

__slots__

  最簡單的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))
相關文章
相關標籤/搜索