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

发布于 2022-09-06 22:19:17 字数 1190 浏览 61 评论 0

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

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

  • 那么请问我应该怎么写才能避免这种情况呢,或者有没有其它比较好的实现方法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

远山浅 2022-09-13 22:19:18
def add_fun(self):

改成

def add_fun(self, i=i):
优雅的叶子 2022-09-13 22:19:18

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

...
def wrapper(i):
    def add_fun(self):
        return self.num + i
    return add_fun
setattr(..., wrapper(i), ...)
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文