簡體   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