[英]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.