1

Ich habe diese Klasse:Python: Wie man eine Methode richtig aufruft?

class Tumor(object): 
    """ 
    Wrapper for the tumor data points. 

    Attributes: 
     idNum = ID number for the tumor (is unique) (int) 
     malignant = label for this tumor (either 'M' for malignant 
        or 'B' for benign) (string) 
     featureNames = names of all features used in this Tumor 
         instance (list of strings) 
     featureVals = values of all features used in this Tumor 
         instance, same order as featureNames (list of floats) 
    """ 
    def __init__(self, idNum, malignant, featureNames, featureVals): 
     self.idNum = idNum 
     self.label = malignant 
     self.featureNames = featureNames 
     self.featureVals = featureVals 
    def distance(self, other): 
     dist = 0.0 
     for i in range(len(self.featureVals)): 
      dist += abs(self.featureVals[i] - other.featureVals[i])**2 
     return dist**0.5 
    def getLabel(self): 
     return self.label 
    def getFeatures(self): 
     return self.featureVals 
    def getFeatureNames(self): 
     return self.featureNames 
    def __str__(self): 
     return str(self.idNum) + ', ' + str(self.label) + ', ' \ 
       + str(self.featureVals) 

und ich versuche, eine Instanz davon in einer anderen Funktion in meinem Code später zu verwenden:

def train_model(train_set): 
    """ 
    Trains a logistic regression model with the given dataset 

    train_set (list): list of data points of type Tumor 

    Returns a model of type sklearn.linear_model.LogisticRegression 
      fit to the training data 
    """ 
    tumor = Tumor() 
    features = tumor.getFeatures() 
    labels = tumor.getLabel() 
    log_reg = sklearn.linear_model.LogisticRegression(train_set) 
    model = log_reg.fit(features, labels) 

    return model 

Aber ich erhalte immer diese Fehlermeldung, wenn ich meine testen Code:

TypeError: __init__() takes exactly 5 arguments (1 given) 

ich verstehe, dass ich nicht die fünf Argumente verwenden, wenn ich die Instanz von Tumor in train_model schaffen, aber wie kann ich das tun?

+1

aber ... Sie rufen Funktionen mit Argumenten an anderer Stelle in Ihrem Code, ohne zu fragen, wie ...? Mach dasselbe mit dem. 'Tumor = Tumor (1,2,3,4)' [Bearbeiten: ohh, es ist nicht klar, dass es der Aufruf an den Klassennamen ist, der die __init__ Methode auslöst! OK, ich verstehe.] – TessellatingHeckler

+0

Nun, haben Sie eine ID-Nummer, ein Label, Feature-Namen und Feature-Werte, um es zu übergeben? – user2357112

+0

Ihre Frage ist nicht wirklich klar. Die init-Methode erfordert einige Werte und Sie sind der einzige, der weiß, wo Sie sie finden können (da es Ihr Skript ist). – lesingerouge

Antwort

0

Argumente zum __init__ (oder __new__, wenn Sie mit, dass) gehen Sie einfach, vorhersagbar, wo Sie die Instanz in train_model erstellen:

tumor = Tumor(idNum, malignant, featureNames, featureVals) 

Natürlich müssen Sie Werte tatsächlich für alle diese , da sie alle erforderlichen Argumente sind.

Sie müssen self jedoch nicht einschließen, da das erste Argument automatisch erledigt wird.

Verwandte Themen