当继承类不是 __init__ 中的参数时,为继承类设置属性值

乔纳森·贝克特尔

我正在创建一个类,当它启动时,它将成为其他类的集合。

现在,init我的类函数如下所示:

class RandomForest():
    def __init__(self, n_estimators=10, min_leaf=5, sample_size = 2/3, min_impurity=1e-5):
    self.n_estimators = n_estimators
    self.tree         = None
    self.min_leaf     = min_leaf
    self.sample_size  = sample_size
    self.min_impurity = min_impurity
    self.trees        = [self.tree(min_leaf=self.min_leaf, impurity_threshold=self.min_impurity) for i in range(n_estimators)]

这个想法是类的两个子类RandomForest将使用不同的类作为属性self.tree,这就是我想在每个子类的启动时修改的内容。

现在我有这个用于子类Random Forest

class RandomForestRegressor(RandomForest):
    def __init__(self):
        self.tree = DecisionTreeRegressor
        super().__init__() 

在我的脑海中,我将 的值设置为self.tree我想要启动的类,然后self.trees将是一个包含 10 个单独实例的列表DecisionTreeRegressor(),但我收到了错误消息:

TypeError: 'NoneType' object is not callable

所以显然 的价值self.tree没有被更新。

此外,我希望这是用户在启动课程时做出的选择,并且应该在没有他们选择的情况下自动设置。

为继承的类设置此属性的正确方法是Random Forest什么?

**编辑:** 这将在 Python 3 中完成。

愚蠢的

如果您在调用超类 init 之前设置属性树,您将在您的类实例中拥有它,但在超类 init 之后调用您还可以:

    self.tree         = None

用值 None 替换您之前设置的树。

你可以:

  • super().__init__()如果没有任何东西依赖于 self.tree 值,则在设置树变量之前调用
class SupClass:
    def __init__():
        self.tree = None

class SubClass(SupClass):
    def __init__():
        super().__init__() # It would set self.tree = None
        self.tree = Something # It will set self.tree to Something

  • 在你的超类中有条件地设置树,例如:self.tree = self.tree if hasattr(self, 'tree') else None只有在之前没有设置 self.tree 时才会设置 None 。
class SupClass:
    def __init__():
        self.tree = self.tree if hasattr(self, 'tree') else None  # Note, it check if value is defined before, in other case you may need to check if value is not None too.

class SubClass(SupClass):
    def __init__():
        self.tree = Something # It will set self.tree to Something
        super().__init__() # It will leave Something, because there is value

  • 把它作为 SupClass init 参数
class SupClass:
    def __init__(tree=None):
        self.tree = tree

class SubClass(SupClass):
    def __init__():
        super().__init__(tree=Something) # Note that your SupClass init method has no argument tree, you use it only in superclass init call.

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章