Python:如何打印string类型的实例变量

时间:2013-12-27 01:28:10

标签: python

我正在尝试打印name()函数返回的字符串变量,在这种情况下应该打印“Jim,但Python正在打印

      `<bound method Human.name of <__main__.Human object at 0x7f9a18e2aed0>>`

以下是代码。

class Human:

    def __init__(self):
            name = None

    def setName(self, _name):
            name = _name

    def name(self):
            return self.name

jim = Human()
jim.setName("Jim")
print(jim.name())

更新: 阅读完答案后,我更新了如下所示的代码,但现在我收到了新的错误TypeError: 'str' object is not callable

class Human:

    def __init__(self):
            self.name = None

    def setName(self, _name):
            self.name = _name

    def name(self):
            return self.name

jim = Human()
jim.setName("Jim")
print(jim.name())

3 个答案:

答案 0 :(得分:6)

self.name是方法本身。您没有存储name的属性。您实际上没有将名称设置为属性。以下作品:

class Human:
    def __init__(self):
        self.name = None

    def setName(self, _name):
        self.name = _name

    # NOTE: There is no more name method here!

现在你有了一个实际的属性,你不需要在这里调用方法:

jim = Human()
jim.setName("Jim")
print(jim.name)  # directly using the attribute

您甚至可以直接设置属性:

jim = Human()
jim.name = "Jim"
print(jim.name)

或者,使用self._name将名称存储在实例上:

class Human:
    _name = None

    def setName(self, _name):
        self._name = _name

    def name(self):
        return self._name

此处我们使用属性Human._name作为默认值,并且仅在self._name方法中的实例上设置Human.setName()

答案 1 :(得分:2)

问题是name是对象内部变量的名称,也是方法的名称。

变量和方法的名称空间是相同的。将方法名称更改为name以外的名称。这将修复你的吸气剂。乍一看,我认为这就是你要做的所有事情,但是Martijn的回答中的建议也适用 - 你需要分配给self.name而不仅仅是名字,以便让你的setter工作。

顺便说一下,这个getter / setter模式通常不适合Python。您应该问自己为什么要使用getter / setter模式而不是直接访问对象的变量。 See the section on getters and setters in this article了解更多细节。

答案 2 :(得分:0)

您可以使用setter和getter属性代替自定义方法。

class Human():
    def __init__(self):
        self._name = None

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

然后,使用它们:

jim = Human()
jim.name = "Jim"
print(jim.name)