簡體   English   中英

在python中動態創建方法

[英]dynamically create methods in python

給出以下代碼段:

def fun(ret):
    return ret

class A:
    def __init__(self):
        for string in ['a', 'b']:
            setattr(self, string, lambda: fun(string))

>>> a = A()
>>> a.a()
'b'

我想要一個返回“ a”的方法a()和一個返回“ b”的方法b()。 只要我不使用lambda表達式,而是將屬性設置為簡單字符串,關聯就是正確的。

我想我的意圖很明確嗎? 那我在哪里錯了?

在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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM