class Base: # 對子類進行了約束,必須重寫該方法 def login(self): # 沒有被實現錯誤 raise NotImplementedError('請重寫login這個方法') # 拋異常 class Nomal(Base): def login(self): pass class Member(Base): def login(self): pass class Admin(Base): def denglu(self): # 報錯,上層程序員沒有按照規範來寫代碼 pass # 項目經理寫的總入口,整合這些功能 def login(obj): print('準備驗證碼...') obj.login() print('進入主頁...') n = Nomal() m = Member() a = Admin() login(n) login(m) login(a) # 報錯
二、抽象類和抽象方法java
from abc import ABCMeta, abstractmethod class Base(metaclass = ABCMeta): @abstractmethod def fangfa(self): pass
# 抽象方法不須要給出具體的方法體,抽象方法內只寫一個pass就能夠了 # 在一個類中若是一個方法是抽象方法,那麼這個類就必定是抽象類 # 在抽象類中,若是有抽象方法,此時這個類不能建立對象 # 若是一個類中全部的方法都是抽象方法,這個類能夠被稱爲接口類 # 寫一個抽象方法:導入一個模塊 from abc import ABCMeta, abstractmethod # 此時抽象類不能建立對象 class Animal(metaclass = ABCMeta): @abstractmethod #抽象方法 def eat(self): pass # 抽象類中能夠有正常的方法 def run(self): print('跑') # 子類必須實現父類中的抽象方法,不然子類也是抽象類,抽象類不能建立對象 # class Cat(Animal): # 此時貓裏面也有一個抽象方法,此時的貓是建立不了對象的 # pass class Cat(Animal): def eat(self): print('貓喜歡吃魚') a = Cat() a.eat() a.run()
#經常使用異常 AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x IOError 輸入/輸出異常;基本上是沒法打開文件 ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典裏不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,致使你覺得正在訪問它 ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
try: 代碼 except 異常類: 出了錯,如何處理異常 except 異常類: 出了錯,如何處理異常 except 異常類: 出了錯,如何處理異常 else: 當程序不出錯 finally: 無論出不出錯都要執行
try: print(1/0) f = open("哈哈", mode = 'r') d = {[]:123} except ZeroDivisionError: print('除以0出錯了') except FileNotFoundError: print('文件不存在的錯誤') except Exception: # 兜底的 print('其餘錯誤') else: # 當try中的代碼不產生任何錯誤的時候,會自動地執行else裏的代碼 pass finally:# 最終,無論出錯,仍是不出錯,都要執行最後的finally,通常用來收尾 print('哈哈哈哈哈')
# 如何本身定義異常 # 隨便寫一個類,這個類只要繼承類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('aa',2))
# 會員買東西 import traceback # 用來查看堆棧信息 class MemberException(Exception): pass class Person: def __init__(self,name,ismember): self.name = name self.ismember = ismember def buy(self): print(f"{self.name}在買東西") def place(ren): if ren.ismember == '是會員': ren.buy() else: raise MemberException("不是會員,快去辦會員吧") try: p1 = Person('zhangmeng','是會員') p2 = Person('zhouyou','不知道') place(p1) place(p2) except MemberException: ret = traceback.format_exc() # 查看對戰信息,錯誤在那裏 print(ret) print('出錯了')
import hashlib # MD5須要導入這個模塊 # 加密的內容(須要的是字節類型) obj = hashlib.md5(b'鹽') obj.update('123456'.encode('utf-8')) # 把要加密的內容給md5 print(obj.hexdigest()) # 拿到密文
# 加密,不可逆 import hashlib # 我本身的md5對象 def my_md5(s): obj = hashlib.md5(b"dhadkfkfnsgadsjndzjb") # 加鹽 obj.update(s.encode("utf-8")) # 把要加密的內容給md5 return obj.hexdigest() # print(my_md5("12345")) # 9246295b87d00ec028dfec692efb55c0 username = 'hutong' password = '9246295b87d00ec028dfec692efb55c0' # 登錄 uname = input('請輸入你的用戶名:') upwd = input('請輸入你的密碼:') if uname == username and my_md5(upwd) == password: print('登錄成功') else: print('登錄失敗')
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以上的分數會被寫入日件 # 建立一個操做日誌的對象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("麻花藤明天請你們吃飯. 去不去?") import traceback class GenderException(Exception): pass class Person: def __init__(self, name, gender): self.name = name self.gender = gender logger1.info(f"這我的的名字是{self.name}, 這我的的性別是:{self.gender}") def xizao(self): print(f"{self.name}在洗澡") class ZaoTang: def nan(self, ren): if ren.gender == "男": ren.xizao() else: raise GenderException("這裏要的是男人") def nv(self, ren): if ren.gender == "女": ren.xizao() else: raise GenderException("這裏要的是男人") try: p1 = Person("zhaoyalei", "男") p2 = Person("linmei", "女") zaotang = ZaoTang() zaotang.nan(p2) zaotang.nv(p1) except GenderException: print("走錯屋了") logger1.error("走錯屋了.. ") logger1.error(traceback.format_exc()) # 把堆棧信息記錄在日誌文件中