一个关于惰性赋值的 python 问题

vibiu
  • 1.1k

这里我把实际业务抽象了一下
我试图创建一个类,它有以下方法:

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函数,但是一般人都不会止步于此,总想着简化一下,是不是可以用动态的方法来生成这些类函数呢?
于是我试图写下了以下方法:

import types


class A:
    def __init__(self,num):
        self.num = num
        self.add_prop(10)    # 这里我们安排设置10个这样的函数
        
    def add_prop(self, n):
        for i in range(n):
            fun_name = 'add_' + str(n)    # 生产函数名
            
            def add_fun(self):
                return self.num + i
                
            setattr(self, fun_name, types.MethodType(add_fun, self))    # 设置函数

似乎从逻辑上说,上面代码能实现我的想法,它确实让class A拥有了10个add_n的属性,但是实际上这些方法其实是同一个的,不能按需返回预定的值。比如add_1,我们期待它返回self.num + 1,但是事实上它返回的是self.num + 10,也就是for i in range(10)中的循环尾数10

  • 那么请问我应该怎么写才能避免这种情况呢,或者有没有其它比较好的实现方法?
回复
阅读 2k
2 个回答
✓ 已被采纳
def add_fun(self):

改成

def add_fun(self, i=i):

这是一个闭包的问题,这样解决

...
def wrapper(i):
    def add_fun(self):
        return self.num + i
    return add_fun
setattr(..., wrapper(i), ...)
...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏