猿问

具有部分功能的动态Python类

print(我对 python3 中的错误感到困惑。


我想用一些类方法动态创建一个类。我似乎能够这样做:


import types


def class_body(ns):

    ns.update({"a": lambda self, x: x - 1})

    return ns


newc = types.new_class("foo", exec_body=class_body)


print(newc().a(3))


# prints 2 as expected

但我也想动态创建类方法。我似乎能够做类似的事情:


import types

def funcs_gen(k=1):

    def fn(self, a):

        return a + k + self.i

    return fn


def class_body(ns):

    ns.update({"a": funcs_gen(k=2), "i": 5})

    return ns


newc = types.new_class("foo", exec_body=class_body)


print(newc().a(1))


# prints 8 as expected

但是如果我尝试对部分函数执行相同的操作,似乎会发生一些奇怪的事情:


import types

from functools import partial


def fn(self, a, k=1):

    return a + k + self.i


def class_body(ns):

    ns.update({"a": partial(fn, k=2), "i": 5})

    return ns


newc = types.new_class("foo", exec_body=class_body)


print(newc().a(1))


# Unexpectedly produces: `TypeError: fn() missing 1 required positional argument: 'a'`


MYYA
浏览 76回答 1
1回答

三国纷争

用于partialmethod方法。import typesfrom functools import partialmethoddef fn(self, a, k=1):    return a + k + self.idef class_body(ns):    ns.update({"a": partialmethod(fn, k=2), "i": 5})    return nsnewc = types.new_class("foo", exec_body=class_body)print(newc().a(1))输出:8
随时随地看视频慕课网APP

相关分类

Python
我要回答