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