class Point:
def __init__(self, x = 0, y = 0):
self.x, self.y = x, y
print "New Point object", self, "constructed"
def __str__(self):
return "(" + str(self.x) + "," + str(self.y) + ")"
def __del__(self):
print "Destructor"
pt1 = Point()
输出:
New Point object (0,0) constructed
方法函数通过非常强的约定接收一个特殊的第一个参数,称为self
,它是实例对象,它是方法调用的隐含主题,并提供对实例属性的访问。
那么为什么 init ()中的self
打印(0, 0)
而不是pt1
?实例对象不是pt1
吗?
答案 0 :(得分:4)
当您定义Point
方法时,您明确告诉(x,y)
对象将自己显示为__str__
。为了使打印工作,它必须将自身转换为字符串,并通过调用__str__
方法来实现。
请注意删除__str__
方法时会发生什么:
New Point object <__main__.Point instance at 0x1005da488> constructed
在这种情况下,python仍然必须将对象转换为字符串才能打印它,但由于没有__str__
的明确定义,因此它使用了它自己的默认实现。
在任何一种情况下,对象本身都不知道它已分配给pt1
,因此它无法打印该信息。实际上,同一个对象可以分配给多个变量,或者根本不分配(即:它可以是列表的成员)。
以下是__str__
上的python 2.7文档的链接:
https://docs.python.org/2/reference/datamodel.html#object.str
答案 1 :(得分:0)
正在打印(0,0)
,因为这是定义__str__
方法的方式。
def __str__(self):
return "(" + str(self.x) + "," + str(self.y) + ")"
它会打印self.x
和self.y
以及一些格式。
因为你将Point设置为
pt1 = Point()
它将使用0
方法中的默认参数0
和__init__
def __init__(self, x = 0, y = 0):
所以它完全符合预期。
答案 2 :(得分:0)
那是因为你明确定义了如何打印这个东西。如果您需要所描述的功能,请参阅How can you print a variable name in python?。
如果您对内省感兴趣,请浏览dir(pt1)
中的所有内容。