python 装饰器

装饰器

# 函数装饰器

    def decorator(func):
        def wrapper(*args, **kwargs):
            func()
            print('涂点粉...')
            print('涂点口红')
            print('变成小萝莉')
    
        return wrapper

类装饰器

   class decorator:
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            self.func(*args, **kwargs)
            print('涂点粉...')
            print('涂点口红')
            print('变成小萝莉')

    @decorator  # d = decorator(girl)     girl = d
    def girl():
        print('俺是大妈....')
    girl()

元类

元类被称为 Python 中的“深奥的巫术”。尽管你需要用到它的地方极少(除非你基于 zope 编程),可事实上它的基础理论其实令人惊讶地易懂。

一切皆对象
一切都有类型
 “class”和“type”之间本质上并无不同
类也是对象
它们的类型是 type
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        print(name)
        print(bases)
        print(attrs)
        attrs['b'] = 'world'
        if attrs.get('test'):#当用到text的时候他被移除所有不会renturn(下两行)到,不会创立空间地址
            attrs.pop('test')
        return type.__new__(cls, name, bases, attrs)

class MyList(object, metaclass=ListMetaclass):
    a = 'hello'

    def test(self):
        print('---->test')

l = MyList()
print(l)
print(l.a)
# print(l.b)
l.test()
 type()  ----> 用来构建所有类型的类
 用法:
 1.type(对象)   ----》 返回的是对象的类型
 2.type(name,bases,attrs)  ----> name 类名   bases: tuple保存的是所有的父类  attrs:{} 字典   类中的所有的属性   

 所有的类底层都是经过type构建出来的。
 自定义元类:
 class xxx(type):
    def __new__(cls,name,bases,attrs):
        do something
        ....
        return type.__new__(cls,name,bases,attrs)

 class Student(父类,metaclass=xxx):
     pass

元类它只做了三件事:

    拦截类的创建
    
    修改类
    
    返回修改之后的类

异常处理

1. 基础:
 try.....except
 
 try:
    可能出现异常的代码
 except:
    如果存在异常执行的代码
    
 扩展:
 try:
    可能出现异常的代码
 except 异常类型1:
    如果存在异常执行的代码
 except 异常类型2:
    如果存在异常执行的代码
 
 Exception是所有异常类型父类,Exception通常是要放在最后的用来接收未知的类型
 如果想获取错误xxxError的报错信息,需要使用格式:
 except 异常类型 as 名字:
    ......
    do something 
    

 try:
    可能出现异常的代码
 except:
    如果存在异常执行的代码
 else:
    没有遇到异常执行的代码
def chu(a, b):
    try:
        a = int(a)
        b = int(b)  # t = TypeError('错误的提示信息')  raise t
        return a / b

    except TypeError as err:  # isinstance(obj,TypeError)    err = t
        print('类型错误', err)  # err 就是错误对象
    except ZeroDivisionError as err:
        print('除数为零', err)
    except Exception as err:
        print('---->出错啦', err)


r = chu(1, 0)
print(r)
print('=========>AAAAAA')

r = chu(10, 'G')
print(r)
print('=========>BBBBBB')
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:
                result = 0
        return result
    except Exception as err:
        print('出错啦!', err)
    # else:
    #     print('正确执行!')
    #     return result
    finally:
        print('00000000')
        return result + 1
        # conn.close()

r = func('+')
print(r)
当出现异常的时候也会运行 finally里面的 不会因为上面有renturn而结束函数,但是当finally里面也有return的时候会执行finally 里面的return,外面的不会执行

异常的传递


```python
 def get_random():
        try:
            list1 = []
            for i in range(5):
                ran = random.randint(1, 10)
                list1.append(ran)
            list1.append('9')
            func(list1)
        except Exception as err:  #err自己起的名字 用来接收产生的错误
            print('+++++++++++++++++>', err)
    
    
    try:
        get_random()
    except Exception as err:
        print(err)
  raise + 自定义异常
    ValueError
    自定义异常,名字上:xxxError
    格式:
       class xxxError(Exception):
          def __init__(self, *args, **kwargs):
               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)

单例类:单例模式

1.单例是一种 设计模式 ,应用该模式的类只会生成一个实例
2.单例模式保证了在程序的不同位置都 可以且仅可以取到同一个对象实例 
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))

装饰器器实现单例

   class cls_decorator:
        def __init__(self, f):
            self.f = f
            self.__instance = {}
    
        def __call__(self, *args, **kwargs):
            if self.f not in self.__instance:
                self.__instance[self.f] = self.f()  # self.f = Singleton   Singleton()
            return self.__instance[self.f]  # {'Singleton':<Singleton object at 0x00000000022205F8>}

函数装饰器实现

def func_decorator(cls):
    _instance = {}

    def wrapper(*args, **kwargs):
   

     if cls not in _instance:
                _instance[cls] = cls()
            return _instance[cls]
    return wrapper


@func_decorator  # 1.cls = cls_decorator()  2. Singleton = cls
class Singleton:
    def __init__(self):
        print('---->Singleton init')


print(Singleton)
s1 = Singleton()  # cls()
s2 = Singleton()

print(s1 is s2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值