Класс внутри класса, генерирующего «имя «self», не определен » ошибка

#python #oop

#python #ооп

Вопрос:

У меня есть следующий код

 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-кода?
Учитывая такую проблему, как бы вы это сделали?

Комментарии:

1. Что вы ожидаете class RandomForest(self) иметь в виду?

2. при наследовании вы должны указывать имя класса, а не имя объекта. self — это объект. и вы еще не определили self

3. Почему вы чувствуете, что вам нужно RandomForest быть внутри Classifier , а не просто отдельным классом вне его?

4. @BrenBarn: Для ясности. Потому что есть другие классы.

5. @neversaint: На самом деле классы работают не так. Если вы хотите сгруппировать несколько классов вместе, поместите их в модуль, а не внутри другого класса.

Ответ №1:

эта запись

 class Classifiers(object)
 

означает, какой класс Classifiers является дочерним object . Потому RandomForest что является его частью Classifiers , не может быть дочерним элементом Classifiers . Таким RandomForest(self) образом, построение класса бессмысленно.

Ответ №2:

Вы должны объявить not 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
 

Ответ №3:

Причина, по которой вы обычно определяете методы класса в self качестве первого аргумента, заключается в том, что (если вы не превратили его в статический метод) методу автоматически передается текущий экземпляр в качестве первого аргумента.

self это просто обычное имя, которое присваивается этому экземпляру, self на самом деле не имеет никакого особого значения в определении класса.

Если вы хотите, чтобы ваш RandomForest класс наследовал от Classifiers , вы должны просто сделать:

 class Classifiers(object):
    """Multiple classifiers"""
    # Rest of the Classifiers definition

class RandomForest(Classifiers):
 

Я не уверен, какую выгоду вы надеялись получить от определения вложенного класса, если вы можете объяснить, что может быть другой способ его достижения.