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