Python的自我论证

时间:2014-11-20 13:53:04

标签: 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):
        print "Destructor"

pt1 = Point()

输出:

New Point object (0,0) constructed

方法函数通过非常强的约定接收一个特殊的第一个参数,称为self,它是实例对象,它是方法调用的隐含主题,并提供对实例属性的访问。

那么为什么 init ()中的self打印(0, 0)而不是pt1?实例对象不是pt1吗?

3 个答案:

答案 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.xself.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)中的所有内容。