Python基础-day14

2019-01-12  本文已影响0人  陈small末

list

​ 枚举

​ 异常

​ 异常处理

​ 自定义异常

​ 单例设计模式(23设计模式 数据结构 算法 操作系统原理 网络工程原理)

枚举类型

​ 什么是枚举:我们可以一一列举的有限集合

​ 月份:(1到12月) 四季:春夏秋冬 生肖:鸡狗猴兔

枚举类型 在python程序里不是基本的数据类型

from enum import Enum ,IntEnum ,unique

具体实现:

​ 我们如果想搞一个自己的枚举类型 我们可以写一个继承自Enum或者IntEnum的一个类

from enum import Enum, IntEnum, unique

@unique
class Week(Enum):
    MON = "周一"
    TUS = "周二"
    WEN = "周三"
    THU = "周四"
    FRI = "周五"
    SAT = "周六"
    SUN = "周天"

# 访问
res = Week.MON.value
print(res)

要求枚举类型的值都是整数类型或整数值的字符串 那么我们就继承IntEnum

示例如下

class HalfYear(IntEnum):
    JAN = 1
    FEB = 2
    MAT = 3
    API = 4
    MAY = 5
    JUN = "6"

print(HalfYear.JUN.value)

异常

​ 程序里 一些不期而遇的 意想不到的问题 导致程序崩溃

常见的异常:

NameError: name 'a' is not defined

ValueError: invalid literal for int() with base 10: 'ss'

TypeError: must be str, not int

IndexError: list index out of range

SyntaxError: invalid syntax

AttributeError: 'dict' object has no attribute 'append'

ZeroDivisionError: division by zero

FileNotFoundError: [Errno 2] No such file or directory: 'hehe'

异常处理

try:
    是我们想要捕获异常代码段(有可能出现问题的地方)
except ValueError as 变量名:
    如果程序出现异常下边的代码将会被执行 如果程序没出错 那么下边的代码 不会被执行
    print("错误", 变量名)
变量名里 包含了我们的错误信息

except可以写多个并且 只要有一个被捕获的类型满足条件 那么其他的except将不会被执行 示例如下

try:
    # int("9o")
    print(a)
except ValueError as e:  在python2里as可以使用,来替代 python3不可以
    print("错误", e)
except NameError as e:
    print("变量不存在", e)
except IndexError as e:
    print("下标错误")
else:
    当程序不出错的时候 会进入下边的代码
finally:
    不管程序是否正常 最后都需要执行此处的代码

当我们无法确定到底会出什么异常 那么我们就使用Exception这个类(常见异常的基类)

自己手动抛出异常

raise 异常类型的类(提示)

raise Exception("字符串位数不正确")

自定义异常

当系统定义的异常类型 不够用的时候 我们可以写一个继承自Exception的一个类

class LengError(Exception):

    def __init__(self, msg):
        # super().__init__(msg)
        self.msg = msg

    def __str__(self):
        return "[LengError]:详情:{}".format(self.msg)

使用

raise LengError("长度不够")
或者
a = "12"
try:
    if len(a) != 3:
        raise LengError("呵呵")
except LengError as e:
    print(e,"___")

单例设计模式(23程序设计模式)

生活里:微信:在跟别人视频的时候 还可以发消息 朋友圈 也就是在微信的软件 多处操作的时候 那个用户 一直都是一个人 也就是你

​ 皇上:太上皇不算 全国只有一个

程序里:

​ 不管我们如何去实例化我们的对象 出来都是一个

单例的实现

装饰器来实现(重点)

def singlton(cls):
    # count = 0
    instance = None
    def inner(*args, **kwargs):
        nonlocal instance
        # if instance == None:
        #     instance = cls(*args, **kwargs)
        #     return instance
        # else:
        #     return instance
        instance = instance if instance else cls(*args, **kwargs)
        return instance

    return inner

@singlton
class Pet:

    def __init__(self,name):
        self.name = name

    def run(self):
        print("runing")

a = Pet("a")
b = Pet("b")
# print(id(a), id(b))
print(a.name, b.name)

练习:

​ 乾隆带和珅与纪晓岚 去东莞玩

​ 皇帝类

​ 单例模式

​ 大臣类:

​ 不使用单例

​ 地点类

​ 名字

from 单例练习.decorator import singlton

@singlton
class Emperor:
    def __init__(self, name):
        self.name = name

    def play(self, minister1, minister2, place):
        my_str = "{}带{}与{},去{}玩~~~".format(
            self.name,
            minister1.name,
            minister2.name,
            place.name
        )
        print(my_str)


class Minister:

    def __init__(self, name):
        self.name = name

class Place:

    def __init__(self, name):
        self.name = name

上一篇下一篇

猜你喜欢

热点阅读