简体   繁体   中英

Python: how to print instance variable of type string

I am trying to print a string variable returned by name() function, which in this case should print "Jim, but Python is printing

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

Below is the code.

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

UPDATE: After reading the answers, i updated the code as shown below, but, now i am getting a new error 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())

self.name is the method itself. You have no attributes storing the name . Nowhere do you actually set the name as an attribute. The following works:

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

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

    # NOTE: There is no more name method here!

Now you have an actual attribute, and you don't need to call the method here:

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

You could even just set the attribute directly:

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

Alternatively, use self._name to store the name on the instance:

class Human:
    _name = None

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

    def name(self):
        return self._name

Here we used a class attribute Human._name as a default, and only set self._name on the instance in the Human.setName() method.

The problem is that name is the name of the internal variable in your object and also the name of the method.

The namespace for variables and methods is the same. Change the name of your method to something other than name . This will fix your getter. On first glance I thought that that would be all you have to do, but the recommendation in Martijn's answer also applies -- you need to assign to self.name and not just name in order to get your setter to work as well.

As an aside, this getter/setter pattern is not usually appropriate for Python. You should ask yourself why you want to use a getter/setter pattern over simply accessing the object's variable directly. See the section on getters and setters in this article for more detail.

You can use setter and getter properties instead of your custom defined methods.

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

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

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

And then, use them:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM