1、类装饰器:
装饰器:
闭包 + 外层函数参数是函数对象 ---装饰器
装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,
然后返回一个callable对象。在Python中一般callable对象都是函数,但也有例外。
只要某个对象重写了 __call__() 方法,那么这个对象就是callable的。
# 类装饰器 class decorate: def __init__(self,func): self.func = func def __call__(self, *args, **kwargs): self.func(*args, **kwargs) print('涂点粉') print('涂点口红...') print('变成小萝莉') @decorate def girl(): print('真是无耻.....') girl()
class decorate: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): class inner_class: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): self.func(*args, **kwargs) print('涂点粉') print('涂点口红...') print('变成小萝莉') return inner_class(*args) @decorate(5) def girl(): print('真是无耻.....') girl()
2、元类
type() -----用来构建所有类型的类
用法:
1、type(对象) ----->返回的对象 的类型
2、type(name,bases,attrs) -----name 类名 bases:tuple保存的是所有的父类
attrs:{} 字典,所有的属性
所有的类底层都是经过type构建出来的
自定义元类:
metaclass 元类相关知识
class xxx(type):
def __new__(cls,name,bases,attrs):
do something
....
return type.__new__(cls,name,bases,attrs)
class Student(父类,metaclass=xxx):
pass
class ListMetaclass(type): def __new__(cls,name,bases,attrs): print(name) print(bases) print(attrs) attrs['b'] = 'world' if attrs.get('test'): attrs.pop('test') return type.__new__(cls,name,bases,attrs) class MyList(object,metaclass=ListMetaclass): a = 'hello' l = MyList() print(l) print(l.a) print(l.b)
3、单例
单例是一种 设计模式 ,应用该模式的类只会生成一个实例。
单例模式保证了在程序的不同位置都 可以且仅可以取到同一个对象实例 :如果实例不存在,会创建一个实例;如果已存在就会返回这个实例。
因为单例是一个类,所以你也可以为其提供相应的操作方法,以便于对这个实例进行管理。
举个例子来说,比如你开发一款游戏软件,游戏中需要有“场景管理器”这样一种东西,用来管理游戏场景的切换、资源载入、网络连接等等任务。
这个管理器需要有多种方法和属性,在代码中很多地方会被调用,且被调用的必须是同一个管理器,否则既容易产生冲突,也会浪费资源。
这种情况下,单例模式就是一个很好的实现方法。
单例模式广泛应用于各种开发场景,对于开发者而言是必须掌握的知识点,同时在很多面试中,也是常见问题。
class Person: __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: cls.__instance = object.__new__(cls,*args, **kwargs) return cls.__instance def __init__(self): print('------init') p1 = Person() p2 = Person() p3 = Person() print(id(p1)) print(id(p2)) print(id(p3))
4、异常处理
异常:
try:
可能出现的异常的代码
except:
如果存在异常执行的代码
else:
没有遇到异常执行的代码
finally:
无论是否存在异常都会执行的代码部分
如果代码有返回值+finally,则肯定会执行finally里面的代码部分
finally在开发的时候,数据库的连接,网络的连接
def func(opr): result =0 try: n1 = int(input('输入第一个数:')) n2 = int(input('输入第二个数:')) if opr == '+': print('正在进行加法运算。') result = n1 +n2 elif opr=='-': print('正在进行减法运算') result = n1 - n2 elif opr=='*': print('正在进行减法运算') result = n1 * n2 elif opr=='/': print('正在进行减法运算') if n2!=0: result = n1 / n2 else: return 0 # return result except Exception as err: print('错误原因:',err) else: print('正确执行') return result finally: print('00000000') return result+1 r = func('+') print(r)
raise + 自定义异常
valueError
自定义异常:名字上:xxxError
格式:
class xxxError(Exception):
def __init__(self,*args,**args):
pass
使用:
raise xxxError("消息“)
处理异常:
try:
有可能有代码异常
except 类型:
处理异常
两大部分:
1.处理异常:
try...except...
try...except...else...
try...except...else...finally
2.自定义异常 + raise
class UserNameError(Exception): def __init__(self, *args, **kwargs): pass class PasswordError(Exception): def __init__(self, *args, **kwargs): pass def register(): username = input('输入用户名:') # 名字长度>=6,不能数字开头 '2' if len(username)<6 or username[0].isdigit(): # 用户名定义出错 raise UserNameError('用户名格式错误') else: print('用户名合法') password = input('输入密码:') if 10>=len(password)>=6: print('注册成功') else: raise PasswordError('密码格式错误') # 调用函数 try: register() except Exception as err: print(err) print('----->123')
例子:宠物商店
''' 宠物商店: issubclass(Cat,(Pet,)) ---> issubclass(类名,(父类1,父类2,。。)) isinstance(pet,Pet) ''' class PetShop: def __init__(self, name): self.name = name self.pets = set() # 动作 def save_pet(self, pet): # print(isinstance(pet, Pet)) if isinstance(pet, Pet): self.pets.add(pet) print('添加成功!') else: print('不是宠物不收留!') def sale_pet(self, pet): if isinstance(pet, Pet): self.pets.discard(pet) print('宠物减少') else: print('不是宠物不收留!') # 查找宠物 def search_pet(self, pname): for pet in self.pets: if pname == pet.pname: print('宠物在商店里') break else: print('不存在此宠物!') # 显示所有的宠物 def all_pets(self): print('宠物商店所有的宠物信息如下:') for pet in self.pets: print(pet) class Pet: type = '宠物' def __init__(self, pname, color, age): self.pname = pname self.color = color self.age = age def __str__(self): return '当前类型是:{},宠物名:{}'.format(self.type, self.pname) class Dog(Pet): type = '狗' def see_house(self): print('特长看家...') class Cat(Pet): type = '猫' def catch_mouse(self): print('特长抓老鼠....') class Bird: pass # 创建对象 shop = PetShop('爱宠') # pet = Pet() cat = Cat('花花', '黄色', 2) bird = Bird() shop.save_pet(cat) # pet =cat dog = Dog('大黄', '棕色', 3) shop.save_pet(dog) shop.all_pets() shop.search_pet('花')