python 執行函式的九種方法

2022-09-25 23:24:10 字數 3270 閱讀 3209

這種是最簡單且直觀的方法

def task():

print("running task")

task()

如果是在類中,也是如此

class task:

def task(self):

print("running task")

task().task()

在 functools 這個內建庫中,有乙個 partial 方法專門用來生成偏函式。

def power(x, n):

s = 1

while n >www.cppcns.com; 0:

n = n - 1

s = s * x

return s

from functools import partial

power_2=partial(power, n=2)

power_2(2)  # output: 4

power_2(3)  # output: 9

如果你有需要動態執行函式的需要,可以使用 eval + 字串 來執行函式。

sys

def pre_task():

print("running pre_task")

def task():

print("running task")

def post_task():

print("running post_task")

ar**s = sys.ar**[1:]

for action in ar**s:

eval(action)()

執行效果如下

$ python demo.py pre_task task post_task

running pre_task

running task

running post_task

若把所有的函式是放在類中,並定義成靜態方法,那就不需要用 eval 了,接著使用 getattr 去獲取並呼叫。

import sys

class task:

@staticmethod

def pre_task():

print("running pre_task")

@staticmethod

def task():

print("running task")

@staticmethod

def post_task():

print("running post_task")

ar**s = sys.ar**[1:]

task = task()

for action in ar**s:

func&nbs程式設計客棧p;= getattr(task, action)

&nbwww.cppcns.comsp;  func()

我們都知道物件都有乙個 __dict__() 的魔法方法,存放所有物件的屬性及方法。

到這裡,大家可以思考一下, 如果還是上面的**,我直接取例項的 __dict__() 能不能取到函式呢?

我相信很多人都會答錯。

上面我們定義的是靜態方法,靜態方法並沒有與例項進行繫結,因此靜態方法是屬於類的,但是不是屬於例項的,例項雖然有使用權(可以呼叫),但是並沒有擁有權。

因此要想通過 __dict__  獲取函式,得通過類本身 task,取出來的函式,呼叫方法和平時的也不一樣,必須先用 __func__ 獲取才能呼叫。

import sys

class task:

@staticmethod

def pre_task():

print("running pre_task")

func = task.__dict__.get("pre_task")

func.__func__()

上面放入類中,只是為了方便使用 getattr 的方法,其實不放入類中,也是可以的。此時你需要借助 globals() 或者 locals() ,它們本質上就是乙個字典,你可以直接 get 來獲得函式。

import sys

def pre_task():

print("running pre_task")

def task():

print("running task")

def post_task():

print("running post_task")

ar**s = sys.ar**[1:]

for action in ar**s:

&nbsgbookkvqcip;globals().get(action)()

先定義乙個字串,內容是你函式的內容,比如上面的 pre_task ,再通過 compile 函式編進 編譯,轉化為位元組**,最後再使用 exec 去執行它。

pre_task = """

print("running pre_task")

"""exec(compile(pre_task, '', 'exec'))

若你的**是放在乙個 txt 文字中,雖然無法直接匯入執行,但仍然可以通過 open 來讀取,最後使用 compile 函式編譯執行。

with open('source.txt') as f:

source = f.read()

exec(compile(source, 'source.txt', 'exec'))

在 operator 這個內建庫中,有乙個獲取屬性的方法,叫 attrgetter ,獲取到函式後再執行。

from operator import attrgetter

class people:

def speak(self, dest):

print("hello, %s" %dest)

p = people()

caller = attrgetter("speak")

caller(p)("明哥")

同樣還是 operator 這個內建庫,有乙個 methodcaller 方法,使用它,也可以做到動態呼叫例項方法的效果。

from operator import methodcaller

class people:

def speak(self, dest):

print("hello, %s" %dest)

caller = methodcaller("speak", "明哥")

p = people()

caller(p)

以上就是我總結的函式執行的十種方法,很多方法,大家也都知道,但是也有幾個方法,幾乎是見不到的,尤其是後面使用 operator 庫的那兩種方法。

迴圈九種方法

今天老師讓用九種方法做 隨機出十個數並求和 但是好像有點雲裡霧裡的,我只會六個,那三個是啥。好像亂了。嗚呼哀哉,先做乙個再說吧!一,第一種方法 private sub command1 click dim i as integer dim a 10 as integer randomize for ...

用Python複製檔案的九種方法

以下是演示 如何在python中複製檔案 的九種方法。shutil copyfile 方法shutil copy 方法shutil copyfileobj 方法shutil copy2 方法os popen方法os系統 方法thread 方法子程序呼叫 方法子程序check output 方法 該方...

執行oracle函式的四種方法

最近在對資料庫進行從sqlserver改造到oracle過程中遇到了乙個頭疼的問題,sqlserver 可以返回乙個結構化的資料集,oracle函式不行,要執行函式 含返回值 函式過程中將語句插進事務性臨時表裡再讀取臨時表 找到如下資料,執行oracle函式的方法 1.在定義函式時 如果有引數,則引...