约束,自定义异常,加密,日志

一.约束

1.python中的约束

(1)人为主动抛异常

#BaseMessage类用于约束,约束其派生类:保证派生类中必须编写send方法
class BaseMessage(object):
    def send(self):
        raise NotImplementedError(".send().必须重写")
class Foo(BaseMessage):pass
obj = Foo()
obj.send()
结果:NotImplementedError: .send().必须重写

class BaseMessage(object):
    def send(self):
        raise NotImplementedError(".send().必须重写")
class Foo(BaseMessage):
    def send(self):
        print("有send方法")
obj = Foo()
obj.send()
结果:有send方法

(2)抽象类+抽象方法

from abc import ABCMeta,abstractclassmethod
class Base(metaclass=ABCMeta): #抽象类
    def f1(self):
        print("123")
    @abstractclassmethod
    def f2(self):pass #抽象方法
class Foo(Base):pass #类中必须有f2方法
obj = Foo()
obj.f2()

2.java,c#中的约束

  java,c# 有类和接口

(1)接口约束

接口:接口不允许在方法内部写代码,只能用来约束他的派生类必须实现接口中定义的方法

语法;interface class Foo:pass

#java中只有单继承,但可以实现两个接口
interface class IFoo:
    def f1(self):pass
    def f2(self):pass
interface class IBaro:
    def f3(self):pass
    def f4(self):pass
class Foo(IFoo,IBar):pass

(2)抽象类+抽象方法约束(抽象类中的非抽象方法内部可以编写代码)

abstact class Foo: #抽象类
    def f1(self):pass#可以编写代码
    abstact def f2(self):pass  #抽象方法
#抽象类可以约束其派生类必须实现抽象类中的抽象方法

总结:

1什么是接口以及接口的作用?

  接口是一种数据类型.主要用于约束派生类中必须实现的指定的方法 

  接口在python不存在,在java,c#中存在

2.python中使用过什么约束?

  (1)抽象类+抽象方法

  (2)人为主动抛异常

3.为什么不常使用抽象类+抽象方法

  编写上麻烦

4.人为主动抛异常,抛出异常可以用其他的吗?

  可以,但是不专业

专业:raise NotImplementedError(".send().必须重写")

不专业:raise Exception(".send().必须重写")

5.应用场景

  多个类,内部必须有某个类或某些类时,需要使用基类+抛异常进行约束

二.自定义异常

1.自定义异常类;异常类要继承Exception

2.主动抛出异常: raise 异常类()

3.捕获异常(捕获异常后异常处理)

# 知识点:如何自定义异常类?
        class MyException(Exception):
            def __init__(self,code,msg):
                self.code = code
                self.msg = msg
        try:
            # 知识点:主动抛出异常 
            raise MyException(1000,'操作异常')

        except KeyError as obj:
            print(obj,1111)
        except MyException as obj: # 知识点:捕获异常 
            print(obj,2222)
        except Exception as obj:
            print(obj.code,obj.msg)

三.加密(hashlib)  无法破解

import hashlib
obj = hashlib.md5(b"abdd")#md5中加入任意字节是加盐
obj.update("admin".encode("utf-8"))#对字节加密
v = obj.hexdigest()
print(v)  #2f5718353c34ad423c603d15ba281f8e
例题:
import hashlib
SALT = b'2erer3asdfwerxdf34sdfsdfs90'
def md5(pwd):
    # 实例化对象
    obj = hashlib.md5(SALT)
    # 写入要加密的字节
    obj.update(pwd.encode('utf-8'))
    # 获取密文
    return obj.hexdigest() #21232f297a57a5a743894a0e4a801fc3 #66fbdc0f98f68d69cd458b0cee975fe3 #c5395258d82599e5f1bec3be1e4dea4a

user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a':
    print('登录成功')
else:
    print('登录失败')

四.日志(logging模块)

1为什么有日志?

  给开发人员看,用于排查错误

2.用logging.basicConfig写日志(只能生成一个日志,写多个时,只有第一个生效)

import logging

logger = logging.basicConfig(filename='xxxxxxx.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('x2')  # 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()

3.自定义日志(可以生成多个日志)

  (1)创建fileHandler

  (2)创建logger对象

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')

 

  

 

posted on 2018-08-31 17:15  阳景♡  阅读(76)  评论(0)    收藏  举报

导航