Python';s的自我论证
输出:Python';s的自我论证,python,python-2.7,Python,Python 2.7,输出: 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):
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()
方法函数接收一个特殊的第一个参数,按非常强的约定称为self
,它是作为方法调用的隐含主题的实例对象,并提供对实例属性的访问
那么为什么
self
在init()中打印(0,0)
而不是pt1
?pt1
不是实例对象吗?当您定义\uu str\uu
方法时,您明确告诉点
对象将自身显示为(x,y)
。为了使打印生效,它必须将自身转换为字符串,并通过调用\uuuu str\uuu
方法来实现
请注意删除\uuu str\uu
方法时会发生什么:
New Point object (0,0) constructed
构造新的点对象
在这种情况下,python仍然必须将对象转换为字符串才能打印它,但由于没有明确的\uuuu str\uuuu
定义,因此它使用自己的默认实现
在这两种情况下,对象本身都不知道它被分配给了pt1
,因此无法打印该信息。事实上,同一个对象可以分配给多个变量,或者根本没有(即:它可以是列表的一个成员)
下面是关于\uuu str\uuu
的python 2.7文档的链接:
它正在打印(0,0)
,因为\uuuu str\uuuu
方法就是这样定义的
New Point object <__main__.Point instance at 0x1005da488> constructed
它打印self.x
和self.y
以及一些格式
既然你把这一点设定为
def __str__(self):
return "(" + str(self.x) + "," + str(self.y) + ")"
它将使用\uuuu init\uuuu
方法中的默认参数0
和0
pt1 = Point()
因此,它完全按照预期工作。这是因为您已经明确定义了打印方式。看看你是否想要你描述的功能
如果您对内省感兴趣,请在
dir(pt1)
中探索所有内容,因为您已经明确定义了如何打印内容。查看是否需要此功能。pt1
只是分配给对象的名称,它与对象的标识或显示没有关联(实际上,对象并不“知道”您认为它的名称是什么)。见例。
def __init__(self, x = 0, y = 0):