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

基督的数量

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

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):toclass DifferentClassN(DifferentClass):cp.__class__ = VarianceThresholdto cp.__class__ = DifferentClass

所以有一个清晰的模板,但是由于cp.__class__ = ...我不能使用混入。

可能可以使用Jinja模板生成此代码,但是有什么方法可以避免它,使用元编程中的一些python技巧?

马斯林

我真的不明白该怎么做,您几乎只说了两次就知道了调用super(),而第二个版本则显式地做了。

可能可以使用Jinja模板生成此代码,但是有什么方法可以避免它,使用元编程中的一些python技巧?

如果您的模式是您始终想self.__class__为其父级“交换” ,则可以使用__bases__或进行访问mro()[1]

  • cls.__bases__是的所有超类的元组cls,它就是您放入括号中的内容(不包括kwargs)
  • cls.mro()是“方法解析顺序”,它会工作的优良这个特定的(完全线性的)情况:装卸属性或方法调用的时候,从开始它的所有类的顺序要经过cls(含税),并在结束object(这是所有Python类的原始祖先)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章