物件導向 約束、自定義異常、加密

Bound_w發表於2018-08-31

1.約束

class BaseMessage(object):
    def send(self,x1):
        """
        必須繼承BaseMessage,然後其中必須編寫send方法。用於完成具體業務邏輯。
        """
        raise NotImplementedError(".send() 必須被重寫.")
class Email(BaseMessage):
def send(self,x1):
"""
必須繼承BaseMessage,然後其中必須編寫send方法。用於完成具體業務邏輯。
"""
pass


obj = Email()
obj.send(1)

 

開頭定義一個約束函式,宣告後邊函式所使用的方法,主動拋異常raise NotImplementedError("方法(),   ")

抽象類和抽象方法的約束

介面中不允許寫程式碼,只能約束,繼承他的類,必須實現介面中定義的所有方法

Java中:interface  Foo:

      def f1(self,x1):pass#表示類中必須繼承f1方法。可以實現多個介面。

 

###抽象類,約束繼承他的派生類必須實現它其中的抽象方法

abstact class Foo:

  def f1(self):

    print(1,3,4)

  abstact def f2(self):pass#抽象方法

 

class Bar(Foo):

  def f2(self):

    print(123)

###Bar繼承了Foo,就必須繼承他的抽象方法,但是抽象類中的正常方法f1可以不用繼承

 

 

python中的抽象類和抽象方法:

from abc import ABCMeta,abstractmethod
class Base(metaclass=ABCMeta):#抽象類
    
    def f1(self):
        print(123)
    @absabstractmethod#抽象方法
    def f2(self):
        pass

class Foo(Base):
     def f2(self):
        print(666)
obj = Foo()
obj.f1()
obj.f2()

 

總結:

1.什麼是介面以及作用?

是一種資料型別,主要用與約束派生類中必須實現的指定方法,python中沒有,Java和c#存在

2.python中使用什麼來約束?

抽象類+抽象方法  編寫上比較麻煩。

人為的主動丟擲異常

3.約束時,丟擲的異常可以使用其他方法

專業的寫法:raise NotImplementedError(".send() 必須被重寫.")

4.應用場景:多個類,內部必須有某些方法是是,需要使用基類加異常進行約束。

 

 

自定義異常:

以前的方法:

try:

a=a1

except Exception as e:

  print(e)

函式方法:

在檔案中找關鍵字prev
import os
def func(path,prev) response={"colde":1000,"data:None} try: if not os.path.exists(path): response["code"]=1001 response["data"]="檔案不存在" return response if onto prev: response["code"]=1002 response["data"]="關鍵字為空" return response except Exception as e : response["code"]=1003 response["data"]="未知錯誤" return response

 

物件導向
import os


class ExistsError(Exception):
    pass

class KeyInvalidError(Exception):
    pass

def new_func(path,prev):
    """
    去path路徑的檔案中,找到字首為prev的一行資料,獲取資料並返回給呼叫者。
        1000,成功
        1001,檔案不存在
        1002,關鍵字為空
        1003,未知錯誤
        ...
    :return:
    """
    response = {'code':1000,'data':None}
    try:
        if not os.path.exists(path):
            raise ExistsError()

        if not prev:
            raise KeyInvalidError()
        pass
    except ExistsError as e:
        response['code'] = 1001
        response['data'] = '檔案不存在'
    except KeyInvalidError as e:
        response['code'] = 1002
        response['data'] = '關鍵字為空'
    except Exception as e:
        response['code'] = 1003
        response['data'] = '未知錯誤'
    return response

 

加密:

引入hashlib模組(幫助加密)

obj=hashilb.md5(b"fhfshsjhjksd")#加鹽

obj.update("admin".enode("utf-8))

v=obj.hexdigest()

print(v)

為防止撞庫,使用加鹽

 

 

日誌:

引入模組logging

import logging
logger =logging.basicConfig(filename='日誌.txt',
                             format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                             datefmt='%Y-%m-%d %H:%M:%S',
                             level=30)
logging.debug("x1")#10
logging.info("2")#20
logging.warning("x3")#30
logging.error("x4")#40
logging.critical("x5")#50
# # logging.log(10,"x6")
import traceback******************************
def func():
    try:
        a=a+1
    except Exception as e :#獲取到堆疊資訊
        msg=traceback.format_exc()
        logging.error(msg)
func()

 

相關文章