繁体   English   中英

如何为生成的类动态定义 python 方法?

[英]How do I define python methods for generated classes dynamically?

我正在尝试实现一种方法来生成许多具有依赖于参数的不同方法的类。 我目前拥有的是:

class Base:
    def __init__(self, y):
        self.y = y

    def method(self, x):
        raise NotImplementedError()


class KlassMethod:
    def __init__(self, a):
        self.a = a

    def __call__(self, base, x):
        return x * self.a + base.y


klass = type("Klass5", (Base,), {'method': KlassMethod(5)})
obj = klass(8)
obj.method(5)

简而言之,我需要 class KlassMethod作为方法,因为我需要将参数a封装在里面,因为不同的klass可以不同。 另一方面,我需要访问对象的属性y 当我运行上面的代码时,我得到了错误:

TypeError: __call__() missing 1 required positional argument: 'x'

如果我没有参数a ,我会像这样将方法实现为 function ,效果很好:

def method(base, x):
    return x + base.y

作为解决方案,我还尝试像这样使用functools.partial

from functools import partial

...

def klass_method(self, x, a):
    return x * a + self.y

klass = type("Klass", (Base,), {'method': partial(klass_method, a=5)})
...

错误是一样的。

如果我们用实例调用它,看起来__call__不能按预期工作。 我该如何解决这个问题?

我认为这可以满足您的要求:

def make_class(a):
    class Klass(Base):
        def method(self, x):
            return x * a + self.y
    return Klass

klass = make_class(5)

此处a关闭,但您也可以将其用作 class 属性:

def make_class2(a):
    class Klass(Base):
        def method(self, x):
            return x * self.a + self.y
    Klass.a = a
    return Klass

我认为编写本地 class 声明通常比动态调用type构造函数更简单,但如果你想这样做(例如,因为每个动态 class 具有不同的 class:那么可能的名称对你来说仍然很重要)

def make_class(a):
    def method(self, x):
        return x * a + self.y
    return type('Klass5', (Base,), {'method': method})

def make_class2(a):
    def method(self, x):
        return x * self.a + self.y
    return type('Klass5', (Base,), {'method': method, 'a': a})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM