我创建了这样的类来解决签名和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__ = VarianceThreshold
to 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] 删除。
我来说两句