1. 程式人生 > >python3.6入門到高階(全棧) day019 約束

python3.6入門到高階(全棧) day019 約束

今日主要內容
1. 約束(1. 丟擲異常, 2. 寫抽象類)(難點, 重點)
1. 丟擲異常; NotImplementedError
例 class Base:
def login(self): # 強制子類做xxxx事
raise NotImplementedError("子類沒有實現該方法") # 報錯. 拋異常

# 1. 普通賬號 --> 翔哥
class Normal(Base):
def login(self):

print("普通賬號的登入")

# 2. 吧務 - > 強哥
class Member(Base):
def login(self):
print("吧務的登入")

# 3. 百度員工 -> 明哥
class Admin(Base):
def denglu(self): # 方法的覆蓋和重寫
print("管理員的登入")

# 專案經理

def wodetian(obj):
obj.login()

n = Normal()
wodetian(n)
m = Member()
wodetian(m)

a = Admin()
wodetian(a)


2. 抽象類
from abc import ABCMeta, abstractmethod

class Base(metaclass = ABCMeta): 抽象類


@abstractmethod
def 方法(self):pass

class Foo(Base): 子類必須重寫父類中的抽象方法
def 方法(self):
pass
一個類包含類抽象方法. 這個類一定是抽象類
抽象類中可以有正常的方法

抽象類中如果有抽象方法. 這個類將不能建立物件

介面: 類中都是抽象方法

例 from abc import ABCMeta, abstractmethod
# 貼吧
# 專案經理(級別高一點兒)
class Base(metaclass=ABCMeta): # 抽象類
# 抽象方法
@abstractmethod # staticmethod, classmethod
def login(self): # 強制子類做xxxx事
pass

def hehe(self): # 抽象類中可以有正常的方法
print("我會呵呵呵")

# b = Base() # 報錯的. 原因是Base是一個抽象類. 含有抽象方法. 不允許建立物件的

# 一個類如果全部都是抽象方法. 這個類可以被稱為介面. 用來約束子類和規範子類

# 1. 普通賬號 --> 翔哥
class Normal(Base):
pass
def login(self): # 重寫了父類中的抽象方法
print("普通賬號的登入")

n = Normal()
n.login()




2. 異常處理
try:

except Error as e:

except....

else:

finally:
收尾

我們在除錯的時候, 最好是能看到錯誤源⾃於哪⾥?
怎麼辦呢? 需要引入另⼀個模組traceback. 這個模組可以獲取到我們每個⽅法的調⽤資訊.
被成為堆疊資訊. 這個資訊對我們拍錯是很有幫助的.

import traceback
try:
# 嘗試執行的程式碼
except Exception as e:
# 除了錯之後要做什麼
traceback.format_exc() # 獲取堆疊資訊(錯誤資訊)


# import traceback
# # 計算a+b
# def cul(a, b):
# if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
# return a + b
# else:
# # 在這裡有兩種方案. 1. 直接返回 , 2. 丟擲異常
# # raise 丟擲 Exception 錯誤和異常,所有錯誤的根
# raise Exception("我要的不是這個. 你應該我傳遞int或者float")
#
#
# try:
# print(cul(1, "胡辣湯")) # 加上異常的處理
# except Exception as e:
# # 獲取到錯誤資訊. 我們需要訪問堆疊資訊
# print(traceback.format_exc()) # 獲取堆疊資訊
# print("出現了錯誤")


3. 日誌處理
logging

critical
error(最多)
wraning
info
debug

例 模板
# filename: ⽂件名
# format: 資料的格式化輸出. 最終在⽇志⽂件中的樣⼦
# 時間-名稱-級別-模組: 錯誤資訊
# datefmt: 時間的格式
# level: 錯誤的級別權重, 當錯誤的級別權重⼤於等於leval的時候才會寫⼊⽂件
logging.basicConfig(filename='x1.txt',
format='%(asctime)s - %(name)s - %(levelname)s -%
(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=0) # 當前配置表示 10以上的分數會被寫⼊⽂件
# CRITICAL = 50
# FATAL = CRITICAL
# ERROR = 40
# WARNING = 30
# WARN = WARNING
# INFO = 20
# DEBUG = 10
# NOTSET = 0
logging.critical("我是critical") # 50分. 最貴的
logging.error("我是error") # 40分
logging.warning("我是警告") # 警告 30
logging.info("我是基本資訊") # 20
logging.debug("我是除錯") # 10
logging.log(2, "我是⾃定義") # ⾃定義. 看著給分


class JackError(Exception):
pass
for i in range(10):
try:
if i % 3 == 0:
raise FileNotFoundError("⽂件不在啊")
elif i % 3 == 1:
raise KeyError("鍵錯了")
elif i % 3 == 2:
raise JackError("傑克Exception")
except FileNotFoundError:
val = traceback.format_exc()
logging.error(val)
except KeyError:
val = traceback.format_exc()
logging.error(val)
except JackError:
val = traceback.format_exc()
logging.error(val)
except Exception:
val = traceback.format_exc()
logging.error(val)