Python 物件導向進階(二)

來源:互聯網
上載者:User

標籤:value   while   遞迴調用   匯入   val   計數器   指定   gpo   iterable   

1. 記憶體回收
  • 小整數對象池
    • Python對小整數的定義是 [-5, 257),這些整數對象是提前建立好的;
    • 在一個Python程式中,所有位於這個範圍內的整數,使用的都是同一個對象;
    • 單個字元共用對象,常駐記憶體;
  • 大整數對象池
    • 每一個大整數,均建立一個新的對象;
  • intern機制
    • 單個單詞,不可修改,預設開啟intern機制,共用對象,當引用計數為0時,則銷毀;
    • 字串(含有空格),不可修改,沒有開啟intern機制,不共用對象;
# 樣本:a1 = "Helloworld"a2 = "HelloWorld"a3 = "HelloWorld"a4 = "HelloWorld"a5 = "HelloWorld"a6 = "HelloWorld"# 說明:# intern 機制,記憶體中只有一個"HelloWorld"所佔的空間,靠引用計數去維護何時釋放。
1.1 GC 記憶體回收
  • Python 採用的是引用計數機製為主,以分代收集機製為輔的策略;
  • gc 模組常用函數:
    • gc.get_threshold(): 擷取gc模組中自動執行記憶體回收的頻率;
    • gc.set_threshold(threshold[, threshold1[, threshold2]])設定自動執行記憶體回收的頻率;
    • gc.get_count(): 擷取當前自動執行記憶體回收的計數器,返回一個長度為3的列表;
    • gc.collect(): 顯示執行記憶體回收;
# 樣本:# 引用計數缺點:循環參考class ClassA():    def __init__(self):        print("object born,id:%s" % str(hex(id(self))))def f2():    while True():        c1 = ClassA()        c2 = ClassA()        c1.t = c2        c2.t = c1        del c1        del c2f2()
2. 內建屬性和內建函數2.1 內建屬性
  • 常用屬性
    • __init__: 構造初始化函數;
    • __new__: 產生執行個體所需屬性;
    • __class__: 執行個體所在的類, 執行個體.__class__
    • __str__: 執行個體字串表示,可讀性; print(類執行個體)
    • __repr__: 執行個體字串表示,準確性; 類執行個體 斷行符號時觸發
    • __del__: del 執行個體時,觸發;
    • __dict__: 執行個體自訂屬性;
    • __doc__: 類文檔,子類不繼承; help(類或執行個體)
    • __getattribute__: 屬性訪問攔截器;
    • __bases__: 類的所有父類構成元素, 類名.__bases__
# 樣本: 屬性攔截器class Test(object):    def __init__(self, subject1):        self.subject1 = subject1        self.subject2 = 'cpp'    # 屬性訪問攔截器,列印日誌資訊    def __getattribute__(self, obj):        print("===1>%s" % obj)        if obj == 'subject1':            print('log subject1')            return 'redicrect python'        else:            temp = object.__getattribute__(self, obj)            print("===2>%s" % str(temp))            return temp    def show(self):        print("this is a Test")s = Test("python")print(s.subject1)print(s.subject2)s.show()# 調用方法步驟:# 1. 先使用屬性訪問攔截器,擷取show屬性對應的方法;# 2. 方法()# 樣本二: 屬性攔截器注意事項class Person(object):    def __getattribute__(self, obj):        print("=== test ===")        if obj.startswith("a"):            return "haha"        else:            return self.test    def test(self):        print("heihei")t = Person()t.a     # 返回 hahat.b     # 會讓程式掛掉# 原因: 當 t.b 執行時,會調用Person類中定義的 __getattribute__ 方法, if 條件不滿足,所以程式# 執行 else 裡面的代碼, 即 return self.test; 因為 return 需要 self.test 的值返回,那麼首先# 要先擷取 self.test 的值, 因為 self 此時就是對象 t, 所以,self.test = t.test, t.test 此時# 要擷取t這個對象的 test 屬性,那麼,就會跳轉到 __getattribute__ 方法去執行,即此時產生了遞迴調用;
2.2 內建函數
  • dir(__builtins__): 可以查看Python解譯器啟動後,預設載入的屬性和函數;
# 樣本一: rangerange(stop)range(start, stop[, step])# 備忘:#   python2中 range 返回列表;#   python3中 range 返回一個迭代值;如果想得到列表,可通過 list 函數#  pyton3 建立列表的另外一種方法:testList = [x*2 for x in range(10)]testList# 樣本二: map 函數# map 函數會根據提供的函數對指定序列做映射# map(function, sequence[, sequence, ...]) -> list#   function: 函數#   sequence: 一個或多個序列,取決於function需要幾個參數;#   傳回值是一個list# 函數需要一個參數map(lambda x: x*x, [1, 2, 3])   # 結果為: [1, 4, 9]# 函數需要兩個參數map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])     # 結果為: [5, 7, 9]# 樣本三: filter 函數# filter(function or None, sequence) -> list, tuple, or string#   function: 接受一個參數,返回布爾值True或False#   sequence: 序列可以是 str, tuple, list#   filter 函數會對序列參數sequence中的每個元素調用function函數, 最後返回的結果包含調用結果為#   True的元素filter(lambda x: x%2, [1, 2, 3, 4])     # 結果為[1, 3]# 樣本四: reduce 函數# reduce(function, sequence[, initial])  -> value#   function: 該函數有兩個參數#   sequence: 序列可以是 str, tuple, list#   initial: 固定初始值#  reduce 函數依次從sequence中取一個元素,和上一次調用function的結果做參數再次調用function。第一次調用#  function時,如果提供initial參數,會以sequence中的第一個元素和initial作為參數調用function, 否則會以#  序列sequence中的前兩個元素做參數調用function。注意,function 函數不能為Nonereduce(lambda x, y: x+y, [1, 2, 3, 4])  # 結果為: 10reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd')      # 結果為: ddaabbcc# 備忘: Python3, reduce函數已經從全域名字空間中移除,現在被放置在functools模組裡面,# 如果需要使用,需要先匯入: from functools import reduce# 樣本五: sorted 函數# sorted(iterable, cmp=None, key=None, reverse=Fale) -> new sorted listsroted(['dd','yy','ee','ss','ww'], reverse=1)
3. 集合 set
  • 集合與之前列表,元組類似,可以儲存多個資料,但是這些資料是不重複的;
  • 集合對象還支援union(聯合), intersection(交), difference(差)和sysmmetric_difference(對稱差集)等數學運算;
# 樣本:a = "abcdef"b = set(a)      # 輸出: {'a', 'b', 'c', 'd', 'e', 'f'}A = "bdfwm"B = set(A)b&B     # 取交集b|B     # 取並集b-B     # 取差集b^B     # 對稱差集(在b或B中,但不會同時出現在二者中)
4. functools
# Python3import functoolsdir(functools)      # 查看所有的工具函數# 函數一: partial函數(偏函數)# 把一個函數的某些參數設定預設值,返回一個新的函數,調用這個新函數會更簡單import functoolsdef showarg(*args, **kw):    print(args)    print(kw)p1 = functools.partial(showarg, 1,2,3)p1()    # 輸出: (1, 2, 3) {}p1(4, 5, 6)     # 輸出: (1, 2, 3, 4, 5, 6)  {}p1(a='python', b='java')    #輸出: (1, 2, 3) {'b':'java', 'a':'python'}# 函數二: wraps 函數# 使用裝飾器時,有一些細節需要被注意。例如,被裝飾後的函數,其實已經是另外一個函數了(函數屬性會發生改變)def note(func):    '''note function'''     # 說明文檔    def wrapper():        '''wrapper function'''        print('note something')        return func()    return wrapper@notedef test():    '''test function'''    print('I am test')print(help(test))   # 輸出wrapper的說明文檔# wrapper()#    wrapper function# functools 包提供了 wraps 裝飾器來消除這樣的副作用import functoolsdef note(func):    '''note function'''    @functools.wraps(func)    def wrapper():        '''wrapper function'''        print('note something')        return func()    return wrapper@notedef test():    '''test function'''    print('I am test')print(help(test))# 輸出:#   test()#       test function


參考資料:

  • Python 核心編程

Python 物件導向進階(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.