zoukankan      html  css  js  c++  java
  • python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator():
        def __init__(self, f):
            print('run in init......')
            self.f = f
    
        def __call__(self, a, b):
            self.f(a, b)
    
    
    @Decorator  # add = Decorator(add)
    def add(a, b):
        print('a + b:', a+b)
    
    
    add(10, 20)

    描述符:

    3.__set__,__get__,__delete__都是啥

    1).这3个特殊的函数说实话我学Python的时候都没有用过,后来在看一些进阶的书的时候才发现它的妙用!

    其实都是Python类里面的描述符概念,描述符允许你自定义在引用一个对象属性是应该完成的事情。这3个特殊的方法组合了Python里面的描述法协议:

    • __set__:在设计属性的时候被调用

    • __get__:在读取属性的时候被调用

    • __delete__:在删除属性的时候被调用

    a=A()

    a.x

    >>

    In __get__ <__main__.A object at 0x10089aa58> <class '__main__.A'>

    被__get__函数截获,这个时候传入的instance是a,而owner是他的类即为A 

    a.x=5

    >>In __set__ <__main__.A object at 0x101feba90> 5

    对x进行赋值的时候,其实就会被__set__捕获,这个时候传入的instance是a,而value为5

    del a.x

    >>In __del <__main__.A object at 0x1040c7a90>

    对x进行删除的时候,其实就会被__del__捕获,这个时候传入的instance是a

    2).有同学说这个描述符有啥用啊

    下面举一个小例子,看看它的妙用,比如我们要设计一个类,我们希望它能想C,C++那样对它们的实例属性做类型检查:

    p=Person()

    p.name='jack' #名字必须是str 

    p.age=18 #年龄必须是int

    p=Person()

    p.name='lily'

    print ('name:',p.name)

    >>

    name: lily

    如果写成

    p.name=123

    >>

    raise TypeError('expected an {}'.format(self.your_type))

    TypeError: expected an <class 'str'>

    Python里面还有很多比较深奥的知识点,这些知识都是进阶的内容。都说Python入门容易精通难,若想要深刻领悟Python之美,需要深入的挖掘和探究它的内在特性,要深入到语言内部去分析它的内在机制和奥秘!我在小密圈里面说过Python有3大难点,我后面会写文章一一介绍!

     

  • 相关阅读:
    双机信任关系
    VCS双机原理
    VCS常用指令
    TCL数组
    TCL数据类型
    TCL列表
    TCL基本语法
    CentOS防火墙中端口的开启和关闭
    会话保持技术及原理技术
    ESN
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9220604.html
Copyright © 2011-2022 走看看