這種是最簡單且直觀的方法
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.在定義函式時 如果有引數,則引...