在python中,除了調(diào)用下載的擴展庫之外,還可以自定義函數(shù),方便自己。把基礎模塊放在固定文件夾(或相對固定文件夾),使用sys.append(r’自定義的模塊路徑’)實例如下:
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比涇川網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式?jīng)艽ňW(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋涇川地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
1、在E:pycharm新建hello.py實現(xiàn)基礎功能函數(shù)(定義一個hello()函數(shù))
2、 調(diào)用自定義的函數(shù)
3、 運行結果為:
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關于python中如何調(diào)用自己寫的函數(shù)的詳細內(nèi)容希望對大家有所幫助,更多有關python教程請關注環(huán)球青藤其它相關文章!
已有字符串形式的函數(shù)名稱,那么如何調(diào)用這個函數(shù)呢?
通過調(diào)用內(nèi)置函數(shù)locals()和globals()返回的字典對象,就可以可以獲得名稱與對象的映射關系。其中,locals()僅在全局范圍內(nèi)調(diào)用時可以獲得函數(shù)對象。 我們來看以下的例子。
需要注意的是,使用上述方法通過字符串調(diào)用函數(shù)時,為了系統(tǒng)的安全,防止執(zhí)行任意函數(shù),需要對函數(shù)名做一些處理,也就是使用統(tǒng)一的前綴為這些函數(shù)命名。例如在上述例子中,使用前綴cmd_+函數(shù)名的形式定義函數(shù)(cmd_help,cmd_sum)。
在傳入函數(shù)名字符串時,只傳入函數(shù)名的后半部分(如"help","sum"),由程序添加前綴后組成完整的函數(shù)名,再調(diào)用該函數(shù)。
對于類的成員函數(shù),則可以使用getattr()獲得類成員函數(shù)。
上述代碼通過字符串調(diào)用了類成員函數(shù),與前一段代碼執(zhí)行的結果相同。
此外,還可以使用字典將字符串與函數(shù)對應起來調(diào)用,缺點就是每增加一個函數(shù)需要相應在字典對象中添加相應的鍵值,增加代碼維護工作量。
以上代碼在Python 3.6以上運行通過。
inname = r"C:\Python27\esri.shp"
outname = "outname.cst"
# 在此處調(diào)用該函數(shù)。函數(shù)體定義必須放在調(diào)用以前??梢酝ㄟ^import
read_ESRT_……(file = inname, fileOut = outname)
# 這兩個參數(shù)只是字符串而已,指明你的文件路徑。注意在python中,若有 \ 號,則最好使用 \\ 雙斜杠,或者如上例,加上前綴 r
首先來看一個函數(shù)間的調(diào)用
類方法:
執(zhí)行結果:
metaclass能有什么用處,先來個感性的認識:
1.1 在wiki上面,metaclass是這樣定義的:In object-oriented programming,
a metaclass is a class whose instances are classes.
Just as an ordinary class defines the behavior of certain objects,
a metaclass defines the behavior of certain classes and their instances.
也就是說metaclass的實例化結果是類,而class實例化的結果是instance。我是這么理解的:
metaclass是類似創(chuàng)建類的模板,所有的類都是通過他來create的(調(diào)用 new ),這使得你可以自由的控制
創(chuàng)建類的那個過程,實現(xiàn)你所需要的功能。
當然你也可以用函數(shù)的方式(下文會講)
4.1 用類的形式
4.1.1 類繼承于type, 例如: class Meta(type):pass
4.1.2 將需要使用metaclass來構建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為Meta(繼承于type的類)
4.2 用函數(shù)的形式
4.2.1 構建一個函數(shù),例如叫metaclass_new, 需要3個參數(shù):name, bases, attrs,
name: 類的名字
bases: 基類,通常是tuple類型
attrs: dict類型,就是類的屬性或者函數(shù)
4.2.2 將需要使用metaclass來構建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為函數(shù)metaclas_new
5.1 basic
metaclass的原理其實是這樣的:當定義好類之后,創(chuàng)建類的時候其實是調(diào)用了type的 new 方法為這個類分配內(nèi)存空間,創(chuàng)建
好了之后再調(diào)用type的 init 方法初始化(做一些賦值等)。所以metaclass的所有magic其實就在于這個 new 方法里面了。
說說這個方法: new (cls, name, bases, attrs)
cls: 將要創(chuàng)建的類,類似與self,但是self指向的是instance,而這里cls指向的是class
name: 類的名字,也就是我們通常用類名. name 獲取的。
bases: 基類
attrs: 屬性的dict。dict的內(nèi)容可以是變量(類屬性),也可以是函數(shù)(類方法)。
所以在創(chuàng)建類的過程,我們可以在這個函數(shù)里面修改name,bases,attrs的值來自由的達到我們的功能。這里常用的配合方法是
getattr和setattr(just an advice)
下面實現(xiàn)python中在一個類中調(diào)用另一個類的函數(shù)方法
或者下面來一個號理解的例子
執(zhí)行結果:
先來介紹內(nèi)部類與外部類是什么?
看源碼解析:
內(nèi)部類調(diào)用外部類的類屬性和類方法
參考文獻1
參考文獻2
參考文獻3
__call__
在Python中,函數(shù)其實是一個對象:
f = abs
f.__name__
'abs'
f(-123)
由于 f 可以被調(diào)用,所以,f 被稱為可調(diào)用對象。
所有的函數(shù)都是可調(diào)用對象。
一個類實例也可以變成一個可調(diào)用對象,只需要實現(xiàn)一個特殊方法__call__()。
我們把 Person 類變成一個可調(diào)用對象:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend
現(xiàn)在可以對 Person 實例直接調(diào)用:
p = Person('Bob', 'male')
p('Tim')
My name is Bob...
My friend is Tim...
單看 p('Tim') 你無法確定 p 是一個函數(shù)還是一個類實例,所以,在Python中,函數(shù)也是對象,對象和函數(shù)的區(qū)別并不顯著。
任務
改進一下前面定義的斐波那契數(shù)列:
class Fib(object):
???
請加一個__call__方法,讓調(diào)用更簡單:
f = Fib()
print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]