print(我對(duì) python3 中的錯(cuò)誤感到困惑。我想用一些類(lèi)方法動(dòng)態(tài)創(chuàng)建一個(gè)類(lèi)。我似乎能夠這樣做:import typesdef class_body(ns): ns.update({"a": lambda self, x: x - 1}) return nsnewc = types.new_class("foo", exec_body=class_body)print(newc().a(3))# prints 2 as expected但我也想動(dòng)態(tài)創(chuàng)建類(lèi)方法。我似乎能夠做類(lèi)似的事情:import typesdef funcs_gen(k=1): def fn(self, a): return a + k + self.i return fndef class_body(ns): ns.update({"a": funcs_gen(k=2), "i": 5}) return nsnewc = types.new_class("foo", exec_body=class_body)print(newc().a(1))# prints 8 as expected但是如果我嘗試對(duì)部分函數(shù)執(zhí)行相同的操作,似乎會(huì)發(fā)生一些奇怪的事情:import typesfrom functools import partialdef fn(self, a, k=1): return a + k + self.idef class_body(ns): ns.update({"a": partial(fn, k=2), "i": 5}) return nsnewc = types.new_class("foo", exec_body=class_body)print(newc().a(1))# Unexpectedly produces: `TypeError: fn() missing 1 required positional argument: 'a'`
1 回答

三國(guó)紛爭(zhēng)
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
用于partialmethod
方法。
import types
from functools import partialmethod
def fn(self, a, k=1):
? ? return a + k + self.i
def class_body(ns):
? ? ns.update({"a": partialmethod(fn, k=2), "i": 5})
? ? return ns
newc = types.new_class("foo", exec_body=class_body)
print(newc().a(1))
輸出:
8
添加回答
舉報(bào)
0/150
提交
取消