#1.try except /2.try except else /3.try except else finally /4.try finally
# try:
# lis = [1,2,3]
# content = int(input('请输入数字'))
# print(lis[content])
# # name
# except IndexError:
# print('超出范围')
# except ValueError:
# print('您输入的不是数字哦')
# except Exception as e: #万能异常(可省略),但是省略以后无法看见具体报错原因。
# print(e)
# else:
# print('成功执行') #没有错误的时候执行else后面的代码
# finally: #无论任何时候,正确还是错误还是其它 ,都执行finally.
# print('我是finally后面的代码')
#else(没有错误的时候执行,可用于显示成功或结果)
#finally(无论如何都执行,可用于操作文件的最后关闭文件)
# def func():
# try:
# print('777')
# return 888
# finally: #就算前面有return也要继续执行,挡不住。
# print('还执行我')
# func()
异常处理
# 7.创建一个对象:触发两个方法:
# 1.构造方法:__new__(cls,*args,**kwargs)
# 2.初始化方法:__init__(self)
#__new__方法是由object调用的类,生成的对象。object.__new__(cls)
# class A:
# def __init__(self,name):#再触发init方法
# self.name = name #进而进行属性赋值等操作
# def __new__(cls, *args, **kwargs):#触发new方法
# return object.__new__(cls) #得到对象的返回值
# b = A('alex')#创建一个对象
#与此方法相关的一个模式:单例模式(只存在一个对象)
# class A:
# _instance = None
# def __init__(self,name):
# self.name = name
# def __new__(cls, *args, **kwargs):
# if not cls._instance:
# cls._instance = object.__new__(cls)
# return cls._instance
# else:return cls._instance
# a = A('alex')#首先创建一个对象,_instance值为None
# b = A('alex')#再创建一个对象,_instance值为第一个对象,直接返回,得到的还是第一个对象的值。
#8.删:1.@property的deleter:删除伪装成属性的方法。
# 2.delattr:删除属性。
# 3.__del__:del 对象名,主动触发__del__方法。主动触发一般用来做关闭文件的动作,在__del__方法下面做关闭文件的操作,
# 防止用户忘记关闭文件资源。
# 如果不主动触发,程序结束后,也会自动触发__del__方法,清除数据。缺点是无法在删除前进行作为。
#9.item系列:
#*对象[参数]:触发__getitem__方法。
# class A:
# def __getitem__(self, item):#对象[item] 得到一个getitem代码中返回值
# return 'b'
# obj = A()
# print(obj['a'])
#*对象[参数] = 值:触发__setitem__方法。
# class A:
# def __setitem__(self, key, value):
# self.__dict__[key]= value
# def __getitem__(self, item):
# return self.__dict__[item]
# b = A()
# print(b['a']) #没有值
# b['a'] = 'liujunjie' #赋值
# print(b['a'])
#*del 对象名:触发 __delitem__:
# class A:
# def __setitem__(self, key, value):
# self.__dict__[key]= value
#
# def __getitem__(self, item):
# return self.__dict__[item]
# def __delitem__(self, key):
# return self.__dict__.pop(key)
# b = A()
# b['a'] = 'liujunjie'
# print(b['a'])
# del b['a'] #触发 __delitem__方法,执行其中的代码,删除key
# print(item.__dict__)
#类的内置方法一般也用于模块的一些内置方法,如:
#random模块的choice/shuffle
#choice(对象):触发__len__和__getitem__方法。
# 1.触发__len__:计算对象的长度,以此来根据概率随机抽取。
# 2.触发__getitem__:使对象变成一个可迭代对象(可以用[]取值的对象)
#shuffle(对象):打乱顺序。触发__len__和__getitem__方法、以及__setitem__方法。
#纸牌
# class Paper:
# ranks = [str(i) for i in range(2,11)] + list('JQKA')
# suits = ['红心','方片','黑桃','草花']
# def __init__(self):
# self._cards = [(rank,suit) for rank in Paper.ranks for suit in Paper.suits]
# def __len__(self):
# return len(self._cards)
# def __setitem__(self, key, value):
# self._cards[key] = value #shuffle触发此方法。
# def __getitem__(self, item):
# return self._cards[item]
# a = Paper()
# print(a[5]) #返回纸牌列表的第五个索引的元素('3', '方片')
# import random
# print(random.choice(a)) #getitem将a变成了可迭代对象,可以用choice随机抽取其中的元素
# random.shuffle(a) #打乱顺序
# print(a._cards)