我正在创建一个类,当它启动时,它将成为其他类的集合。
现在,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
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] 删除。
我来说两句