python之路--類的約束, 異常處理, MD5, 日誌處理
阿新 • • 發佈:2018-12-21
錯誤 如果 gen abc 後臺 相加 deb finall 百度貼吧
1. 類的約束
1. 寫一個父類,父類中的某個方法要拋出一個異常 NotImplementedError
class Base: # 對子類進行了約束. 必須重寫該方法 # 以後上班了. 拿到公司代碼之後. 發現了notImplementedError 繼承他 直接重寫他 def login(self): # 沒有被實現錯誤 raise NotImplementedError("你要重寫一下login這個方法. 否則報錯!") # 拋異常 . class Member(Base): def login(self): print("我是普通人登錄") class BaWu(Base): def login(self): print("吧務登錄") class Houtai(Base): def denglu(self): # 報錯, 上層程序員寫代碼沒有按照規範來 需要改成login print("後臺登錄") # 整合這些個功能 def deng(obj): obj.login() m = Member() bw = BaWu() ht = Houtai() deng(m) deng(bw) deng(ht)
2. 抽象類和抽象方法
# 抽象方法不需要給出具體的方法體. 抽象方法內只寫一個pass就可以了
# 在一個類中如果有一個方法是抽象方法. 那麽這個類一定是一個抽象類
# 抽象類中. 如果有抽象方法. 此時這個類不能創建對象
# 如果一個類中所有的方法都是抽象方法. 這個類可以被稱為接口類
# 寫一個抽象方法:導入一個模塊 from abc import ABCMeta, abstractmethod # 此時抽象類不能創建對象 class Animal(metaclass=ABCMeta): # 寫完這東西. 就是個抽象類 @abstractmethod # 抽象方法 def chi(self): pass # 吃應該只是一個抽象概念. 沒辦法完美的描述出來吃什麽東西 # 抽象類中可以有正常的方法 def dong(self): print("動物會動") # class Cat(Animal): # 此時貓裏面也有一個抽象方法, 此時的貓是創建不了對象的 # pass class Cat(Animal): def chi(self): # 重寫父類中的抽象方法 print("貓喜歡吃魚") a = Cat() a.chi() a.dong()
2. 異常處理
1. 異常處理. try except raise
try:
代碼
except 異常類:
除了錯, 如何處理異常
except 異常類:
除了錯, 如何處理異常
except 異常類:
除了錯, 如何處理異常
else:
當程序不出錯
finally:
不管出不出錯, 都要執行
try: print(1/10) # f = open("哈哈哈哈哈", mode="r") # d = {[]:123} except ZeroDivisionError: # 可以處理所有錯誤 print("除以0出錯了") except FileNotFoundError: print("文件不存在的錯誤") except Exception: # 兜底的 print("其他錯誤") else: # 當try中的代碼不產生任何錯誤的時候. 會自動的執行else裏的代碼 pass finally: # 最終. 不管出錯還是不出錯. 都要執行最後的finally 一般用來收尾 print("哈哈哈哈哈哈哈哈啊哈")
2. raise 異常類("信息")
如何自己定義異常
class 類(Exception):
pass
# 如何自己定義異常 # 隨便寫一個類. 這個類只要繼承了Exception 這個類就是一個異常類就可以作為raise對象 class CulException(Exception): pass # 如何手動拋出異常 def cul(a, b): # 只能是數字相加 if (type(a) == int or type(a) == float ) and (type(b) == int or type(b) == float): return a + b else: # 拋出異常 # raise 異常類(錯誤信息) raise CulException("我沒辦法給你處理這樣的運算") print(cul("就不放, 氣死你",2))
3. 堆棧
import traceback # 用來查看堆棧信息
class GenderException(Exception):
pass
class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender
def xizao(self):
print(f"{self.name}在洗澡")
def nan_zao_tang_zi(ren):
if ren.gender == "男":
ren.xizao()
else:
raise GenderException("性別不對. 去對門看看") # 拋異常是很重要的
try:
p1 = Person("張三", "不知道")
p2 = Person("李四", "男")
nan_zao_tang_zi(p1)
nan_zao_tang_zi(p2)
except GenderException:
# ret = traceback.format_exc() # 查看堆棧信息, 看錯誤的
# print(ret)
print("出錯了. 很可惜")
3. MD5
import hashlib def my_md5(s): obj = hashlib.md5(b"ghjhgfl") # 加鹽 裏面的字母隨便給 obj.update(s.encode("utf-8")) # 把要加密的內容給md5 return obj.hexdigest() print(my_md5("我是吳彥祖")) # afd1938a01d0c5894d0781fb335249a3
4. 日誌處理
等級:
critical: 50
error:40
warning:30
info:20
debug:10
import logging # # 配置好日誌的處理, 默認就是GBK logging.basicConfig(filename=‘x1.txt‘, # 把日誌信息寫入的文件名 format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘, datefmt=‘%Y-%m-%d %H:%M:%S‘, # 時間的格式 level=40) # 當前配置表示 10以上的分數會被寫入日件 # 向日誌文件寫入內容 logging.critical("我是賭神,我是賭神") # 50, 幾乎是最高的 logging.error("我是周潤發") # 40 平時使用最多的就是他 logging.warn("氣死我了") # 30 警告 logging.warning("還好吧") logging.info("提示") # 20 級 logging.debug("開發的時候把這個開著") # 10 logging.log(999, "寶寶今天有懵逼了") # level = 999
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(‘騰訊qq‘, level=10) # 創建一個日誌文件處理對象
logger1.addHandler(file_handler) # 把文件添加到日誌
logger1.error("麻花藤明天請大家吃飯. 去不去?")
# 再創建一個操作日誌的對象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(‘百度貼吧‘, level=logging.DEBUG)
logger2.addHandler(file_handler2)
logger2.error("我才不去呢. 我們在北京. 離你那麽遠")
python之路--類的約束, 異常處理, MD5, 日誌處理