打赏

Python基础(30)——上下文管理,描述符应用,类装饰器,元类

上下文管理 with

with open ('a.txt')  as f :       open(a.txt)就是实例化文件得到了一个对象,然后把对象赋值个f ,with 一个f的对象 ,后面不需要再写关闭,是因为类中间定义了一个协议,__enter__   __exit__来实现

 with 部分触发 __enter__     执行完成结束后触发__exit__

with中代码如果有异常报错则直接跳到exit部分:1、如果exit的返回值为true代表把错误吞掉了,则继续  2、如果不是True,则吐出了异常,则暂停。3、exit运行完毕代表了with语句运行完毕

好处就是上下文管理,有自动清理功能,无须手动干预

文件,网络链接  和锁的编程环境中,可以在exit中订制自动释放资源的机制,省很多麻烦

描述符应用 其实就是用类来代理一个其他类的描述(str数据描述符等)

描述符是新式类,被代理的类也应该是新式类

必须定义到类的类属性,不能定义到构造函数init里

遵守优先级: 1、类属性  2 数据描述符set del   3 实例属性  4 非数据描述符get  5找不到属性触发 getattr 

因为有描述符的存在,所以Python是个弱类型的语言,不需要提前声明类型,其他语言需要先声明类型

描述符就可以代理一个属性,这样就可以限制输入输出类型了

class Typed:
    def __get__(self, instance, owner):   #get是非数据描述符
        print('get fangfa')
        print('instance %s'%instance)
        print('owner %s'%owner)
    def __set__(self, instance, value):   #set   del 是数据描述符  是赋值函数 优先级比较高
        print('set fangfa')
        print('instance %s' % instance)
        print('owner %s' % owner)

class stu:
    name=Typed()   #Typed就是name的描述符
    def __init__(self,name):
        self.name=name

stu1=stu('elax')
stu1.name='elax1'
print(stu1.name)

描述符可以用来判断类型是否符合情况下返回结果,可以改写,比如传入年龄要判断是字符串还是整数型

数据属性赋值给描述符,那么这个数据类型在类中的字典dirt中是不会显示的,不存在自己的字典中

 类装饰器@

高阶函数  套头 一个类,在内部实现一些功能,再返回类

@这个装饰器的功能,不管是什么类型他都当成是对象来处理

如果想加参数那么需要在高阶函数外再套一层函数,外层函数用来接收参数,内层函数用来实现主要的逻辑

用类装饰器为类加类属性,判断等等

property装饰器类

复习property

class Room:
    def __init__(self, width, length):
        self.width = width
        self.length = length

    @property
    def area(self):
        return self.width * self.length


r1 = Room(10, 10)
print(r1.area)

类中加上@就会执行    @是个触发  操作

描述符是高级库和框架类编程,暂时就了解,确实现在也稀里糊涂

其实就是利用了 get set  del 的优先级(数据描述符set del优先 于 非数据描述符 get的机制)来实现一些预先的存储功能,等等,这样写的库和程序来给别人使用。可以预先处理一些功能给别人实现。

描述符案例 :商品价格 ,折扣  ,价格赋值,删除价格等

      还有类型检测等

 

metaclass元类 metaclass=自定义元类  

class Foo:
    pass
f1=Foo()

f1是Foo类的对象,一切皆对象,那么Foo这个对象是type类的对象,元类就是 类的 模版

类是对象的模版, 那么元类是类的模版  类也就是元类的对象

type是Python的一个内建元类,type还可以实例化一个类,了解就好

 

posted on 2019-07-20 18:24  大有哥  阅读(97)  评论(0)    收藏  举报

导航