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大难点,我后面会写文章一一介绍!

 

原文地址:https://www.cnblogs.com/wuchenggong/p/9220604.html