python编程小提示
一.面向對象的約束
1.基于人為的約束
?
calss BaseMessage(object):def send(self,x):#必須繼承BaseMessage,然后其中必須編寫send方法.用于具體業務邏輯.raise NotImplementedError(".send() 必須被重寫") class Email(BaseMessage):def send(self,x):#必須繼承BaseMessage,然后其中必須編寫send方法,用于完成具體邏輯return x obj = Email() obj,send(1)
?
如果Email類中未編寫send(),仍繼續使用繼承父類的send(),則會報錯打印? '.send() 必須重寫'.父類中raise NotImplementedError有約束作用,提示子類必須編寫send()方法.
2.抽象類和抽象方法的約束
from abc import ABCMeta,abstractmethodclass Base(metaclass=ABCMeta): # 定義抽象類def f1(self):print('酸辣')@abstractmethoddef f2(self): #抽象方法pass class Foo(Base):def f2(self):print('帥')obj = Foo() obj.f1()
Foo類只有編寫父類抽象方法f2()時候,程序才可以正常進行,否則報錯.
二.自定義異常處理
?有時在編寫代碼的時候我們需要編寫異常情況,用到Exception萬能處理時,有一個小小的缺點,就是不能提醒我們此時程序報的是什么錯誤,所以有時候我們要針對一些情況自定義異常處理.
import os class ExistsError(Exception):pass class KeyInvalidError(Exception):pass def new_func(path,prev):response = {'code':1000,'data':None}try:if not os.path.exists():raise ExistsError()if not prev:raise KeyInvalidError()passexcept ExistsError as e:response['code'] = 1001response['data'] = '文件不存在'except KeyInvalidError as e:response['code'] = 1002response['data'] = '關鍵字為空'except Exception as e:response['code'] =1003response['data'] = '未知錯誤'return response print(new_func("C:\劉清揚\PyCharm 2018.1.4\python.py","we"))
這樣我們就可以得到當'文件不存在','關鍵字為空'時出現的報錯了.
class MyException(Exception):def __init__(self,code,msg):self.code = codeself.msg = msg try:raise MyException(100,'操作異常')except KeyError as obj:print(obj,1111) except MyException as obj:print(obj,222) #打印(100,'操作異常') 222 except Exception as obj:print(obj,3333)
三.為你的文件加密
在登錄程序時,為了不讓你的密碼不被盜取,所以應該在儲存密碼時將明文改為密人,讓隱私更安全.
import hashlibdef md5(pwd):obj = hashlib.md5() obj.update(pwd.encode('utf-8'))return obj.hexdigest() print(md5('21312e')) #打印d09c5c2fd74e97e2e9e98bbc8d0a3e4b
將密碼21312e轉為密文??09c5c2fd74e97e2e9e98bbc8d0a3e4b
還可以繼續為我們的密碼加鹽(嚴)
import hashlib Salt = b'qwqw1212' #加嚴 def md5(pwd):obj = hashlib.md5(Salt)obj.update(pwd.encode('utf-8'))return obj.hexdigest() print(md5('21312e')) 打印81dda1ec99f8327b68659dbc56ee46c5
四.自定義日志
當我們寫好程序給用戶體驗時,如果用戶操作出報錯信息,我們直接排查bug時將非常不方便.這時候我們編寫一個日志功能,將報錯詳細錄入,將會方便我們以后工作.
import logging logger1 = logging.basicConfig(filename='x1.txt',format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S',level=30) #當level大于等于30時,會被錄入日志 logging.error('x4') logging.error('x5')
當我們想要將兩個(或多個)報錯信息分別錄入兩個(多個)時,需要自定義日志.
import logging # 創建一個操作日志的對象logger(依賴FileHandler) file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8') file_handler.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))logger1 = logging.Logger('s1', level=logging.ERROR) logger1.addHandler(file_handler) logger1.error('123123123')# 在創建一個操作日志的對象logger(依賴FileHandler) file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8') file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s"))logger2 = logging.Logger('s2', level=logging.ERROR) logger2.addHandler(file_handler2)logger2.error('666')
?五.python2和python3的區別
字符串:? ?python2:unicode? ?v = u"root"? ?本質上是用unicode存儲(萬國碼)
(str/bytes)? ? ? ? ? v = "root"? ? ? 本質上用字節存儲
python3:str? ? v = "root"? ? 本質上是用unicode存儲(萬國碼)
bytes? ?v = b"root"? ?本質上用字節存儲
編碼:? ?python2: 默認ascii? 文件頭可以修改,? #-*- encoding:utf-8
python3: 默認utf-8? 文件頭也可以修改
繼承:? python2:? 經典類/新式類(object)
? ? ? ? ? ?python3:新式類
輸入:? python2:? ? v = raw_input('')
? ? ? ? ? python3? ? ? v = input('')
打印:? ?python2 :? print 'xx'
? ? ? python3: print('xx')
轉載于:https://www.cnblogs.com/liuqingyang/p/9395564.html
總結
以上是生活随笔為你收集整理的python编程小提示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于HttpClient上传中文乱码的解
- 下一篇: sourcetree管理git