類裝飾器,元類,垃圾回收GC,內建屬性、內建方法,集合,functools模塊,常見模塊

'''''''''類裝飾器'''class Test():    def __init__(self,func):        print('---初始化---')        print('func name is %s'%func.__name__)        self.__func = func    def __call__(self, *args, **kwargs):        print('---類裝飾器中的內容----')        self.__func@Test   #至關於test = Test(test)def test():    print('---test---')test()  #調用Test類中的__call__方法。'''Python中萬物皆對象,類也是一個對象,以下面一個類在定義後,他就是一個Person對象'''print('--------------------1---------------------')class Person():    print('----xxxxxx-------')    def __init__(self):        self.name = 'an''''元類:元類就是用來建立類(對象)的,元類就是類的類。'''print('--------------------2---------------------')def printNum(self):    print('----num-%d-----'%self.num)Test3 = type('Test3',(),{'printNum':printNum})  #type()就是來定義元類的,第一個參數:類名,第二個參數:父類,第三個參數:屬性名或方法名。t3 = Test3()t3.num = 100t3.printNum()#下面代碼就和上邊元類定義類效果同樣,可是元類將類定義和方法定義分開,方便維護。class printNum2():    def printNum(self):        print('----num-%d-----' % self.num)t2 = printNum2()t2.num = 100t2.printNum()#元類:metaclass_recvdef  upper_attr(a,b,c):     #第一個參數:類名,第二個參數:類的父類,第三個參數:類的屬性。    #便利屬性字典,把不是__開頭的屬性名字變爲大寫    newAttr = {}    for name,value in c.items():        if not name.startswith("__"):            newAttr[name.upper()] = value    #調用type來建立一個類    return type (a,b,newAttr)class Foo(metaclass=upper_attr):    #設置Foo類的元類爲upper_attr,做用是,建立類的時候決定建立的類是什麼樣子的,                                    #建立類的時候先執行metaclass屬性對應的東西。    bar = 'bip'print(hasattr(Foo,'bar'))print(hasattr(Foo,'BAR'))f = Foo()print(f.BAR)'''垃圾回收GC:引用計數爲主,隔代回收爲輔。'''print('--------------------3---------------------')#引用計數機制:對象引用計數爲0時,垃圾回收。但解決不了循環引用。import gcclass 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 c2        gc.collect()    #手動進行垃圾回收# gc.disable()  關閉GC    gc.enable() 開啓GC# f2()import sysa = ClassA()print(sys.getrefcount(a))      #查看對象引用個數#所謂垃圾回收就是調用對象的__del__方法。'''內建屬性'''print('--------------------4---------------------')class Itcast():    def __init__(self,subject1):        self.subject1 = subject1        self.subject2 = 'cpp'    #屬性訪問時攔截器,打log    def __getattribute__(self, item):   #item--->"subject2"        if item == 'subject1':            print('log subject1')            return 'redirect python'        else:       #測試時註釋掉這2行,將找不到subject2            return object.__getattribute__(self,item)   #調用父類object的方法。    def show(self):        print('this is Itcast')s = Itcast("python")print(s.subject1)print(s.subject2)s.show()    #先獲取show屬性對應的結果,,,應該是一個方法;方法()。'''內建方法'''print('--------------------5---------------------')print(range(1,10))  #range()返回的是一個迭代值,何時用何時生成值,同生成器原理。                    # 若是想的獲得列表,用list(rang())print(list(range(1,8,2)))   #第三個參數是步長#map():根據原有數據獲得新的數據m = map(lambda x : x*x ,[1,2,3])    #[1,2,3]可迭代,但不是迭代對象for i in m:    print(i)m2 = map(lambda x,y : x+y,[1,2,3],[4,5,6])for i in m2:    print(i)def f1(x,y):    return (x,y)l1 = [0,1,2,3,4,5,6]l2 = ['Sun','M','T','W','T','F','S']l3 = map(f1,l1,l2)print(list(l3))#fileter():有篩選功能l4 = filter(lambda x : x%2,[1,2,3,4])     #function接受一個參數,返回布爾值True或False。print(list(l4))l5 = filter(None,"she")     #參數爲None時不過濾print(list(l5))from functools import reduceprint(reduce(lambda x,y : x+y,[1,2,3,4]))print(reduce(lambda x,y : x+y,['aa','bb','cc'],'dd'))ss = [1,3,2,5,4]print(sorted(ss))   #返回一個排序以後的新的列表print(ss)ss.sort()   #將列表排序print(ss)'''集合'''print('---------------------6--------------------')aaa = [11,22,11,22,33]print(set(aaa))     #集合去重#集合運算&、|、aa = {'a','b','c'}bb = {'a','c','d'}print(aa&bb)print(aa|bb)print(aa-bb)print(aa^bb)    #對稱差集'''functools模塊'''print('---------------------6--------------------')import functoolsprint(dir(functools))   #functools模塊中經常使用函數#偏函數def showarg(*args,**kwargs):    print(args)    print(kwargs)p1 = functools.partial(showarg,1,2,3)   #只須要傳一次參數,後邊再去調用這個函數的時候,相應的參數就不用再傳了。p1()p1(4,5,6)p1(a='python',b='itcast')#wraps函數def note(func):    "note function"    # @functools.wraps(func)    #當加上這行,查看test()的說明文檔時就會看到它本來的註釋。    def wrapper():        "wrapper function2222"        print('note something')        return func()    return wrapper@notedef test():    "test function"    print('I am test')#使用裝飾器時,有一些細節須要被注意,例如,被裝飾後的函數其實已是另一個函數了(函數名等函數屬性會發生改變)。#添加後因爲函數名和函數的doc發生了改變,對測試結果有一些影響。print(help(test))   #此處函數的說明文檔是裝飾器中的說明文檔,而非test()的本來的說明文檔註釋。'''常見模塊'''print('---------------------7--------------------')#經常使用標準庫:#builtins:內建函數默認加載      os:操做系統接口             sys:Python自身的運行環境#functools:經常使用的工具           json:編碼和解碼JSON對象     logging:記錄日誌、調試#multiprocessing:多進程         threading:多線程            copy:拷貝#time:時間                      datetime:日期和時間         calendar:日曆#hashlib:加密算法               random:生成隨機數           re:字符串正則匹配#socket:標準的BSD Sockets API   shutil:文件和目錄管理       glob:基於文件通配符搜索import hashlibm = hashlib.md5()   #建立hash對象:md5:(message-Digest Algorithm 5)消息摘要算法,得出一個128位的密文。print(m)    #<md5 HASH object>m.update(b'itcast')  #更新哈希對象以字符串參數print(m.hexdigest())#經常使用第三方擴展庫:#requests:使用的是urllib3,繼承了urllib2的全部特性   urlib:基於http的高層庫                scrapy:爬蟲#beautifulsoup4:HTML/XML的解析器                     celery:分佈式任務調度模塊             redis:緩存#Pillow(PIL):圖像處理                                xlsxwriter:僅寫excel功能,支持xlsx    xlwt:僅寫Excel,支持xls,2013或更早版office#xlrd:僅讀Excel功能                                  elasticsearch:全文搜索引擎            pymysql:數據庫鏈接庫#mongoengine/pymongo:mongodbpython接口               matplotlib:畫圖                       numpy/scipy:科學計算#diango/tornado/flask:web框架                        xmltodict:xml轉dict                   SimpleHTTPServer:簡單的HTTPServer,不使用Web框架#gevent:基於協程的python網絡庫                       fabric:系統管理                       pandas:數據處理庫#scikit-learn:機器學習庫
相關文章
相關標籤/搜索