为什么我不能连接' str'和'实例'类中的对象?

时间:2017-07-22 02:51:08

标签: python string class instance init

class myClass:

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

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

            return more_text + text

上面是我正在构建的用于从网页中提取数据的代码的过度简化版本。我正在运行这样的temp.py代码。

>>> 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

我见过很多关于&#39; str&#39;的连接问题的例子。和&#39;实例&#39; Stack Overflow中的对象。

我尝试过以下方法:

选项1:在 init AS INPUT

期间将文本转换为字符串
class myClass:

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

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

            return more_text + text

但我明白了......

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

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

选项2:在 init 步骤

期间将文本转换为字符串
class myClass:

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

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

            return more_text + text

但我明白了......

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

有人可以帮我解决一个问题吗?请注意,在我的原始代码中,我的目的是连接类中的两个字符串对象以创建网页链接。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

这里有几个问题:

在为对象创建的每个函数上,必须包含self作为第一个参数。

使用你的第二个例子:

class myClass:

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

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

            return more_text + text

然后,您创建了一个类的实例,并且可以访问函数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?"

如果要使用与初始化文本相同的文本,则需要将其作为类的属性引用而不是作为新参数text,如下所示:

class myClass:

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

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

            return more_text + self.text

然后,如果你想参考上面的内容:

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

答案 1 :(得分:2)

您面临的主要问题是:

def printText(text):

您收到此错误的原因是,作为实例方法,声明要求您将self(实例对象)作为第一个参数传递。您现在正在传递text,它被用作 self (实例)。这就是你得到错误的原因,因为你最终在做什么试图添加一个带有实例的字符串。

因此,知道第一个被隐式传递给printText的参数是实例,并查看你的方法,你实际想要引用你内部的self.text printText方法。但是,传入printText实例实际上称为text。这可能非常令人困惑。

因此,按照建议的命名法,您应该将实例参数命名为&#34; expect&#34;,self。

考虑到这一点,您要引用的text现在可以引用为self.text

这可以通过修复代码来显示:

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

        return more_text + self.text