在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  Python  網(wǎng)絡(luò)安全/ 一個關(guān)于惰性賦值的 python 問題

一個關(guān)于惰性賦值的 python 問題

這里我把實際業(yè)務(wù)抽象了一下
我試圖創(chuàng)建一個類,它有以下方法:

class A:
    def __init__(self, num):
        self.num = num
 
    def add_1(self):
        return self.num + 1
        
    def add_2(self):
        return self.num + 2
    
    def add_3(self):
        return self.num + 3
    
    ...

這里的需求清楚的不能再明顯了,我可以不斷的編寫add_n函數(shù),但是一般人都不會止步于此,總想著簡化一下,是不是可以用動態(tài)的方法來生成這些類函數(shù)呢?
于是我試圖寫下了以下方法:

import types


class A:
    def __init__(self,num):
        self.num = num
        self.add_prop(10)    # 這里我們安排設(shè)置10個這樣的函數(shù)
        
    def add_prop(self, n):
        for i in range(n):
            fun_name = 'add_' + str(n)    # 生產(chǎn)函數(shù)名
            
            def add_fun(self):
                return self.num + i
                
            setattr(self, fun_name, types.MethodType(add_fun, self))    # 設(shè)置函數(shù)

似乎從邏輯上說,上面代碼能實現(xiàn)我的想法,它確實讓class A擁有了10個add_n的屬性,但是實際上這些方法其實是同一個的,不能按需返回預(yù)定的值。比如add_1,我們期待它返回self.num + 1,但是事實上它返回的是self.num + 10,也就是for i in range(10)中的循環(huán)尾數(shù)10

  • 那么請問我應(yīng)該怎么寫才能避免這種情況呢,或者有沒有其它比較好的實現(xiàn)方法?
回答
編輯回答
孤毒

這是一個閉包的問題,這樣解決

...
def wrapper(i):
    def add_fun(self):
        return self.num + i
    return add_fun
setattr(..., wrapper(i), ...)
...
2018年9月12日 07:27
編輯回答
淚染裳
def add_fun(self):

改成

def add_fun(self, i=i):
2018年3月10日 16:34