码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-06-24 16:04:40      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:color   obj   object   小例子   get   必须   raise   很多   pad   

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__和类装饰器的结合使用

标签:color   obj   object   小例子   get   必须   raise   很多   pad   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!