元编程在使用类时如何从模板生成类?

2024-03-29 00:57:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了这样的类来解决签名和功能名称的问题:

import copy
from sklearn.feature_selection import VarianceTreshold


class VarianceThresholdN(VarianceThreshold):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.feature_names = None

    #hack from https://stackoverflow.com/questions/51430484/how-to-subclass-a-vectorizer-in-scikit-learn-without-repeating-all-parameters-in    
    def get_params(self, deep=True): 
        params = super().get_params(deep)
        cp = copy.copy(self)
        cp.__class__ = VarianceThreshold
        params.update(cp.__class__.get_params(cp, deep))
        return params

    def fit(self, X, y=None):
        self.feature_names = list(X.columns)
        return super().fit(X, y)

不幸的是,我需要创建很多这样的类,所以大量的复制粘贴和替换有两件事: class VarianceThresholdN(VarianceThreshold):class DifferentClassN(DifferentClass):cp.__class__ = VarianceThresholdcp.__class__ = DifferentClass。你知道吗

所以有一个清晰的模板,但是由于cp.__class__ = ...我不能使用mix-ins。你知道吗

也许这段代码可以用jinja模板生成,但是有没有办法避免它,用元编程的一些pythonic技巧呢?你知道吗


Tags: fromimportselfgetinitdefparamscp
1条回答
网友
1楼 · 发布于 2024-03-29 00:57:43

我真的不明白该怎么做,你几乎只是调用super()两倍,我可以告诉你,与第二个版本显式这样做。你知道吗

Probably this code could be generated with jinja templates, but is there any way to avoid it, with some pythonic trick from meta-programming?

如果您的模式总是希望为其父级“交换”self.__class__,则可以使用__bases__mro()[1]访问它:

  • cls.__bases__cls的所有超类的元组,它正是你放在paren中的内容(不包括kwargs)
  • cls.mro()是“方法解析顺序”,对于这种特定(完全线性)的情况,它可以很好地工作:它是处理属性或方法调用时要经历的所有类的序列,从cls(包含)开始,到object(所有Python类的原始祖先)结束。你知道吗

相关问题 更多 >