自定义字符串表示:__str__方法 [Python]

Python能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法__str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:

print objectOfClass

那么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。

Code1

#!/usr/bin/env python
class PhoneNumber:
        def __init__(self,number):
                self.areaCode = number[1:4]
                self.exchange = number[6:9]
                self.line=number[10:14]
        def __str__(self):
                return "(%s) %s-%s" % (self.areaCode, self.exchange, self.line)
def test():
        newNumber = raw_input("Enter phone number in the form (123) 456-7890: \n")
        phone = PhoneNumber(newNumber)
        print "The phone number is:",
        print phone
if __name__ == "__main__":
        test()
Print1
Enter phone number in the form (123) 456-7890:
(345) 234-5461
The phone number is: (345) 234-5461

方法__init__接收一个形如"(xxx) xxx-xxxx"的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。
方法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:
print phone
就会执行以下语句:
print phone.__str__()
程序如果将PhoneNumber对象传给内建函数str,或者为PhoneNumber对象使用字符串格式化运算符%(例如"%s"%phone),Python也会调用__str__方法。
test函数从用户处请求一个电话号码,新建一个PhoneNumber对象,并打印对象的字符串表示。记住,假如模块作为一个单独的程序运行(即用户对模块调用Python解析器),Python就会将"__main__"指派给命名空间的名称(保存在内建变量__name__中)。如果PhoneNumber.py作为单独的程序运行,就会调用函数test()。
大多数Python模块都采用了这种机制:定义一个driver函数,检测模块的命名空间以执行函数。这样做的好处在于,模块作者可为模块定义不同的行为,具体由模块的使用背景决定。如果另一个程序导入模块,__name__的值就会是模块名(例如"PhoneNumber"),而test函数不会执行。如果模块作为单独的程序运行,__name__的值是"__main__",test函数会执行。