我有以下代码
class Classifiers(object):
"""Multiple classifiers"""
class RandomForest(self): # this line generate error
"""
Random Forest Classifier Object.
"""
@staticmethod
def classifier(X, y):
from sklearn import ensemble as ens
classifier = ens.RandomForestClassifier(n_estimators=15)
return(X,y,classifier)
但是为什么会产生这个错误:
----> 5 class RandomForest(self):
6 """
7 Random Forest Classifier Object.
NameError: name 'self' is not defined
在一天结束时,我会这样称呼它:
rf = Classifiers.RandomForest()
X, y, rf_clsf = rf.classifier(some_X_, some_y_)
总而言之,实现上述OO代码的优雅和正确方法是什么? 鉴于这种问题,你会怎么做?
答案 0 :(得分:1)
此记录
class Classifiers(object)
表示课程Classifiers
is child of object
。由于RandomForest
是Classifiers
的一部分,因此它不能成为Classifiers
的孩子。因此,RandomForest(self)
类构造毫无意义。
答案 1 :(得分:0)
您必须在self
的签名中声明RandomForest
。 self
是Classifiers
和self
,用于访问Classifiers
个属性。您必须使用__init__
RandomForest
class Classifiers(object):
class RandomForest():
def __init__(otherself, Classifiers): #RandomForest's constructor. otherself here is analog self of Classifiers
otherself.a = 1
pass
def __init__(self): #Classifiers's constructor
self.b = 2
c = Classifiers()
print c.RandomForest(c).a
答案 2 :(得分:-1)
您通常使用self
作为第一个参数定义类方法的原因是(除非您将其转换为静态方法),该方法会自动将当前实例作为第一个参数传递。< / p>
self
只是赋予该实例的传统名称,self
在类定义中实际上没有任何特殊含义。
如果您希望RandomForest
班级继承自Classifiers
,您应该这样做:
class Classifiers(object):
"""Multiple classifiers"""
# Rest of the Classifiers definition
class RandomForest(Classifiers):
我不确定您希望从嵌套类定义中获得什么好处,如果您可以解释可能有不同的方法来实现它。