python类和函数_构建程序. Python中的类和函数
如果希望mainfunc的所有實例都使用相同的KeySeq對象,則可以使用默認(rèn)參數(shù)值技巧:
def mainfunc(ks=KeySeq()):
key = ks.next()
只要您實際上沒有傳遞ks值,對mainfunc的所有調(diào)用都將使用在定義函數(shù)時創(chuàng)建的KeySeq實例.
如果您不知道,這就是為什么:函數(shù)是一個對象.它具有屬性.它的屬性之一被命名為func_defaults.它是一個元組,其中包含其簽名中所有具有默認(rèn)值的參數(shù)的默認(rèn)值.當(dāng)您調(diào)用函數(shù)且不為具有默認(rèn)值的參數(shù)提供值時,該函數(shù)將從func_defaults中檢索該值.因此,當(dāng)您在不提供ks值的情況下調(diào)用mainfunc時,它將從func_defaults元組中獲取KeySeq()實例.對于mainfunc實例,該實例始終是相同的KeySeq實例.
現(xiàn)在,您說要發(fā)送“ mainfunc的多個實例到PP的提交功能”.您是說多個實例嗎?如果是這樣,我所描述的機(jī)制將無法正常工作.
但是創(chuàng)建一個函數(shù)的多個實例很棘手(而您發(fā)布的代碼則沒有).例如,此函數(shù)在每次調(diào)用g時都會返回一個新的g實例:
>>> def f():
def g(x=[]):
return x
return g
>>> g1 = f()
>>> g2 = f()
>>> g1().append('a')
>>> g2().append('b')
>>> g1()
['a']
>>> g2()
['b']
如果我不帶任何參數(shù)調(diào)用g(),它將從其func_defaults元組中返回默認(rèn)值(最初是一個空列表).由于g1和g2是g函數(shù)的不同實例,因此x參數(shù)的默認(rèn)值也是一個不同的實例,如上所示.
如果您想使此操作比使用默認(rèn)值的棘手副作用更明確,則可以采用以下另一種方法:
def mainfunc():
??????如果沒有hasattr(mainfunc,“ ks”):
??????????setattr(mainfunc,“ ks”,KeySeq())
??????鍵= mainfunc.ks.next()
最后,您發(fā)布的代碼忽略了一個非常重要的要點:如果要對共享數(shù)據(jù)進(jìn)行并行處理,則與數(shù)據(jù)相關(guān)的代碼需要實現(xiàn)鎖定.查看Parallel Python文檔中的callback.py示例,看看如何在Sum類中使用鎖定以及原因.
總結(jié)
以上是生活随笔為你收集整理的python类和函数_构建程序. Python中的类和函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dwf文件怎么打开 详细的操作方法
- 下一篇: 用python画树_Python+Tur