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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.