我创建了这样的类来解决签名和功能名称的问题:
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模板生成,但是有没有办法避免它,用元编程的一些pythonic技巧呢?你知道吗
我真的不明白该怎么做,你几乎只是调用super()两倍,我可以告诉你,与第二个版本显式这样做。你知道吗
如果您的模式总是希望为其父级“交换”
self.__class__
,则可以使用__bases__
或mro()[1]
访问它:cls.__bases__
是cls
的所有超类的元组,它正是你放在paren中的内容(不包括kwargs)cls.mro()
是“方法解析顺序”,对于这种特定(完全线性)的情况,它可以很好地工作:它是处理属性或方法调用时要经历的所有类的序列,从cls
(包含)开始,到object
(所有Python类的原始祖先)结束。你知道吗相关问题 更多 >
编程相关推荐