c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?
生活随笔
收集整理的這篇文章主要介紹了
c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
在關于Python描述符函數的詳解三篇中,我們有提到如何基于類創建一個“描述符函數”,之所以能夠基于類創建這樣一個概念,是因為用到了類中的__call__屬性,從前述文章中可知,當類中定義了__call__屬性時,基于該類所創建的對象就成為一個可被調用的函數。這樣的做法我們已經知道,可是這中間的運行機制是怎樣的呢?這一篇文章中,我們將從函數的可被調用性入手來深入分析一下。Python中的可調用操作符
當我們談到在Python中調用一個函數時,通常指的是在特定函數名后緊跟一對小括號,當然如果有參數的話,將參數包括在小括號中,甚至有人將函數名后的成對小括號稱為“調用操作符”,如果函數名后不帶成對小括號,那么Python解釋器只是給出這是一個函數的提示,并不會運行它,比如先定義一個函數say_hello:def say_hello(): print("Hello Python!")當不帶對成小括號時:say_hello輸出:<function?__main__.say_hello()>從上述輸出可知,Python解釋器只是告訴我們say_hello是一個函數,如果帶上成對小括號,那么該函數就會被執行:say_hello()輸出:Hello Python!很顯然,所有的函數都是可被調用的。但是當任意給出一個對象時,我們如何知道它是否可以被調用呢?難道要對每一個給定的對象都帶上成對小括號進行測試嗎?如果真是這樣的話,我們來看看那些不能被調用的對象帶上成對小括號后,結果會怎樣,比如我們來定義一個字符串,看看字符串是否可被調用:hello = "Hello, Python!"hello()上述代碼在執行時被解釋器報出錯誤,從提示來看,是說str對象不具備可調用性,那么,有沒有一種方便的方法來測試哪些對象可被調用,哪些又不可被調用呢?答案是肯定,那就是callable()函數。callable()函數
在Python的內置函數中,有一個callable()函數恰好是專門用來測試一個對象是否可被調用,當該對象可被調用時,它返回True,否則返回False,比如我們用它來測試一下上面創建的函數say_hello()函數和hello字符串:>>> callable(say_hello)>>>?輸出:True>>> callable(hello)>>> 輸出:False在之前的文章中,我們知道lambda函數是匿名函數,那么這類函數是可被調用的嗎?下面一個例子可給出說明:>>> callable(lambda x: x*x)>>>?輸出:True從輸出結果可知,lambda函數同樣屬于可被調用的對象。類是可被調用的嗎?
從上面的分析,我們知道函數是可被調用的,字符串是不可被調用的,那么類是可被調用的嗎?為了方便起見,我們不用創建特別的類,就用Python的內置幾個類即可,比如str、int、dict、list,這些都是Python中最基本的類,更重要的是,它們都可以被緊跟其后的成對小括號來創建一個對象,比如我們常用的dict()等,因此,我們可猜測:它們都是可被調用的。下面來驗證一下該結論:types = [str, int, dict, list]for item in types: print("{} | callable: {}".format(type(item), callable(item)))從上述輸出結果可知,這些基本類都是可被調用的,那么,我們自定義的類是否為可調用的呢?下面我們創建一個自定義類來看一下:class person: pass>>> callable(person)>>> 輸出:True上述結果表明,我們自定義的類也是可被調用的,也就是說person()這樣的調用是被準許的。但由上述創建的類person實例化的一個對象是否還可被調用呢?我們來繼續測試:p1 = person()p1()程序出錯了,從錯誤提示來看,是說由person類創建的對象不具備可調用性。我們用callable()測試一下:>>> callable(p1)>>>?輸出:False果然,person類的實例不能被調用,那么我們是否可以創建出一個可被調用的類實例呢?答案依然是肯定的。可被調用的類實例
在Python中,有一個特別的方法叫做__call__,它可以幫我們實現剛才的想法,比如我們重新修改person類:class person: def __init__(self, name): self.name = name def __call__(self): return "你好,{}!".format(self.name)在上述類中,我們用__init__方法完成對類實例的初始化,它接受一個名字做為新實例了名字,同時該類中也實現了__call__方法,它使得創建的實例具備了可調用性:>>> p2 = person("花花")>>> p2()>>>?輸出:'你好,花花!'非常棒!只要在所創建的類中實現__call__方法,則所創建的類實例便擁有了可調用的特性,也正是這樣,才使得基于類創建“描述符函數”成為可能。小結
在這篇文章中,我們分析了對象的可調用性,并介紹了用來測試對象是否可被調用的callable()函數,之后又研究了如何在普通的類中添加__call__方法來創建一個可被調用的類實例,這些內容屬于Python知識點的較深度分析,供大家參閱。總結
以上是生活随笔為你收集整理的c++定义一个动态对象数组_如何在Python中自定义一个可被调用的对象实例?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab画微分方程的矢量场图_MAT
- 下一篇: android javamail获取邮件