python小知识-__call__和类装饰器的结合使用

匿名 (未验证) 提交于 2019-12-02 22:54:36
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‘>

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.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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!