我正在尝试打印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())
答案 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)