为了账号安全,请及时绑定邮箱和手机立即绑定

具有部分功能的动态Python类

具有部分功能的动态Python类

MYYA 2024-01-15 15:22:12
print(我对 python3 中的错误感到困惑。我想用一些类方法动态创建一个类。我似乎能够这样做: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但我也想动态创建类方法。我似乎能够做类似的事情: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但是如果我尝试对部分函数执行相同的操作,似乎会发生一些奇怪的事情: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 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

用于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


查看完整回答
反对 回复 2024-01-15
  • 1 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信