1. 程式人生 > >python小知識-__call__和類裝飾器的結合使用

python小知識-__call__和類裝飾器的結合使用

python get 都沒有 IV ini ble 自定義 裝飾器 介紹

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__和類裝飾器的結合使用