#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):
Я не уверен, какую выгоду вы надеялись получить от определения вложенного класса, если вы можете объяснить, что может быть другой способ его достижения.