在python中动态创建方法

时间:2018-05-28 16:38:19

标签: python

给出以下代码段:

'date_of_birth' => 'nullable|date_format:Y-m-d|before:today',

我想要一个返回'a'的方法a()和一个返回'b'的方法b()。只要我不使用lambda表达式但将属性设置为简单字符串,关联就是正确的。

我认为我的意图很明确?那我错在哪里?

1 个答案:

答案 0 :(得分:1)

在Python中,函数将在定义它的作用域中查找非本地名称,或者如果名称在那里不存在则在全局作用域中查找非本地名称。如果与名称关联的值发生更改,则返回的值也会更改。请注意,这不是lambda函数所特有的。

解决这个问题的方法是通过编写辅助函数来创建闭包。

def fun(ret):
    return ret

class A:
    def __init__(self):
        def apply_fun(item):
            return lambda: fun(item)

        for string in ['a', 'b']:
            setattr(self, string, apply_fun(string))

print(A().a())  # 'a'

替代解决方案

在这种特殊情况下,使用__getattr__可能更适合,因为它旨在动态返回属性。

def fun(ret):
    return ret

class A:
    def __getattr__(self, item):
        if item in ['a', 'b']:
            return lambda: fun(item)

print(A().a())  # 'a'