python小知识-__call__和类装饰器的结合使用
Posted 富0代
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python小知识-__call__和类装饰器的结合使用相关的知识,希望对你有一定的参考价值。
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大难点,我后面会写文章一一介绍!
以上是关于python小知识-__call__和类装饰器的结合使用的主要内容,如果未能解决你的问题,请参考以下文章