2017-07-22 3 views
1
class myClass: 

    def __init__(self, text): 
      self.text = text 

    def printText(text): 
      more_text = "Why so " 

      return more_text + text 

Oben ist eine über-vereinfachte Version eines Codes, den ich konstruiere, um Daten aus Webseiten zu extrahieren. Ich verwende den temp.py-Code wie folgt.Warum kann ich 'str' und 'instance' Objekte nicht innerhalb einer Klasse verketten?

>>> from temp import myClass 
>>> text = "serious?" 
>>> joker_says = myClass(text) 
>>> 
>>> print joker_says.printText() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "temp.py", line 9, in printText 
    return more_text + text 
TypeError: cannot concatenate 'str' and 'instance' objects 

Ich habe viele Beispiele für Verkettung Fragen der ‚str‘ und ‚instance‘ Objekte in Stack-Überlauf zu sehen.

Ich habe die folgende Art und Weise versucht:

OPTION 1: AS INPUT

class myClass: 

    def __init__(self, str(text)): 
      self.text = text 

    def printText(text): 
      more_text = "Why so " 

      return more_text + text 

Text TO STRING WÄHREND init CONVERT Aber ich bekomme ...

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "temp.py", line 3 
    def __init__(self, str(text)): 
        ^
SyntaxError: invalid syntax 

== == == == == ==

OPTION 2: CONVERT text TO STRING WÄHREND init STEP

class myClass: 

    def __init__(self, text): 
      self.text = str(text) 

    def printText(text): 
      more_text = "Why so " 

      return more_text + text 

Aber ich bekomme ...

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "temp.py", line 9, in printText 
    return more_text + text 
TypeError: cannot concatenate 'str' and 'instance' objects 

Kann jemand bitte geben Sie mir eine gute Lösung für das Problem? Bitte beachten Sie, dass ich in meinem ursprünglichen Code zwei String-Objekte innerhalb der Klasse verketten möchte, um einen Link zur Webseite zu erstellen. Jeder Vorschlag wäre willkommen.

+1

seit 'Text' in' printText' ist das erste Argument für Ihre * Methode * wird * implizit die Instanz übergeben, wird somit nicht Arbeit. –

Antwort

3

Sie haben ein paar Probleme hier:

Auf jeder Funktion, die Sie für ein Objekt zu erstellen, müssen self als ersten Parameter enthalten sein.

Ihr zweites Beispiel verwenden:

class myClass: 

    def __init__(self, text): 
      self.text = str(text) 

    def printText(self, text): 
      more_text = "Why so " 

      return more_text + text 

Dann machen Sie eine Instanz der Klasse, und Sie können die Funktion zugreifen printText:

joker = myClass("This is some text") 
print(joker.text) # This prints: "This is some text" 
print(joker.printText("serious?")) # This prints "Why so serious?" 

Wenn Sie den gleichen Text verwenden mögen, wie der Initialisieren Text, müssen Sie es verweisen, statt als neue Parameter text, als Attribut der Klasse, wie so:

class myClass: 

    def __init__(self, text): 
      self.text = str(text) 

    def printText(self): 
      more_text = "Why so " 

      return more_text + self.text 

Dann, wenn Sie die oben verweisen möchten:

joker = myClass("serious?") 
print(joker.text) # This prints: "serious?" 
print(joker.printText()) # This prints "Why so serious?" 
+1

Danke! Ich denke ich verstehe. Wie auch immer, ich denke, wie du schon sagtest, sollte es einen eigenen Text in printText geben, aber keinen Text. Auf diese Weise sucht printData nicht nach zwei Eingaben. Ich schätze die schnelle Antwort! – troymyname00

2

Das Hauptproblem Sie konfrontiert sind, ist dies:

def printText(text): 

Der Grund, warum diese Fehlermeldung erhalten, weil, als Instanzmethode, die Deklaration Sie self (die Instanz-Objekt) bestanden haben, Unerwartetes erstes Argument. Sie übergeben jetzt text, das als self (die Instanz) verwendet wird. Das ist der Grund, warum Sie den Fehler erhalten, weil Sie letztendlich versuchen, eine Zeichenfolge mit einer Instanz hinzuzufügen.

So wissen, dass das erste Argument implizit printText weitergegeben wird, ist die Instanz, und innerhalb Ihrer Methode suchen, sind Sie tatsächlich wollen die self.text in Ihrem printText Methode verweisen. Ihre Instanz, die in printText übergeben wird, wird jedoch tatsächlich als text bezeichnet. Dies kann sehr verwirrend sein.

Also, nach der vorgeschlagenen Nomenklatur, sollten Sie Ihr Exemplar Argument als "erwartet", selbst nennen.

In diesem Sinne kann Ihr text, auf den Sie verweisen möchten, jetzt als self.text referenziert werden.

Dies kann der Code durch Fixieren angezeigt:

def printText(self): 
     more_text = "Why so " 

     return more_text + self.text 
+1

Beachten Sie, OP verwendet 'print joker_says.printText()', so dass ein 'TypeError' geworfen wird, weil es ein Argument fehlt ... –

+1

@ juanpa.arrivillaga Shoot. Du hast mir gerade klar gemacht, was das eigentliche Problem ist. Danke, dass du das angesprochen hast. – idjaw

+0

@ juanpa.arrivillaga Danke. Ich habe es repariert. – idjaw

Verwandte Themen