'''''''''類裝飾器'''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:機器學習庫