在一个类中产生名称' self'没有定义'错误

时间:2014-06-20 06:26:02

标签: python oop

我有以下代码

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代码的优雅和正确方法是什么? 鉴于这种问题,你会怎么做?

3 个答案:

答案 0 :(得分:1)

此记录

class Classifiers(object)

表示课程Classifiers is child of object。由于RandomForestClassifiers的一部分,因此它不能成为Classifiers的孩子。因此,RandomForest(self)类构造毫无意义。

答案 1 :(得分:0)

您必须在self的签名中声明RandomForestselfClassifiersself,用于访问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):

我不确定您希望从嵌套类定义中获得什么好处,如果您可以解释可能有不同的方法来实现它。