【发布时间】:2019-12-09 11:45:27
【问题描述】:
我创建了这样的类来解决签名和特征名称的问题:
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__ = VarianceThreshold 到 cp.__class__ = DifferentClass。
所以有一个明确的模板,但是由于cp.__class__ = ...我不能使用mix-ins。
可能这段代码可以使用 jinja 模板生成,但是有什么方法可以避免它,使用元编程中的一些 Python 技巧?
【问题讨论】:
标签: python python-3.x oop scikit-learn metaprogramming