◎知识点
类对象的特殊方法之__str__()和__repr__()
类对象的特殊方法之__new__()
◎脚本练习
▽ 类对象的特殊方法之__str__()和__repr__()
"""一、类对象的特殊方法之__str__()和__repr__()""" """ 类对象的特殊方法之__str__()和__repr__()用于自定义并返回实例对象的字符串表示形式 1. 当在交互式命令行中直接打印一个实例对象时, 如果在实例对应的类对象中实现了特殊方法__repr__(),会自动调用该方法; 否则,会打印实例对象对应的类对象和实例对象在内存中的地址 2. 当调用内置函数print打印一个实例对象时, 如果在实例对象对应的类对象中实现了特殊方法__str__(),会自动调用该方法 否则,如果在实例对象对应的类对象中实现了特殊方法__repr__(),会自动调用该方法; 否则,会打印实例对象对应的类对象和实例对象在内存中的地址 3. 当调用内置函数str创建字符串并且实参是一个实例对象时, 如果在实例对象对应的类对象中实现了特殊方法__str__(),在内置函数str的内部会自动调用该方法; 否则,如果在实例对象对应的类对象中实现了特殊方法__repr__(),在内置函数str的内部会自动调用该方法; 否则,会打印实例对象对应的类对象和实例对象在内存中的地址 4. 当调用内置函数repr创建字符串并且实参是一个实例对象时, 如果在实例对象对应的类对象中实现了特殊方法__repr__(),在内置函数repr的内部会自动调用该方法; 否则,会打印实例对象对应的类对象和实例对象在内存中的地址 """ """ >>> class MyClass(object): ... pass ... >>> mc = MyClass() >>> mc <__main__.MyClass object at 0x103f41550> >>> print(mc) <__main__.MyClass object at 0x103f41550> >>> str(mc) '<__main__.MyClass object at 0x103f41550>' >>> repr(mc) '<__main__.MyClass object at 0x103f41550>' """ """ >>> class MyClass(object): ... def __str__(self): ... return "__str__被调用" ... >>> mc = MyClass() >>> mc <__main__.MyClass object at 0x103e5c588> >>> print(mc) __str__被调用 >>> str(mc) '__str__被调用' >>> repr(mc) '<__main__.MyClass object at 0x103e5c588>' """ """ >>> class MyClass(object): ... def __repr__(self): ... return "__repr__被调用" ... >>> mc = MyClass() >>> mc __repr__被调用 >>> print(mc) __repr__被调用 >>> str(mc) '__repr__被调用' >>> repr(mc) '__repr__被调用' """ """ >>> class MyClass(object): ... def __str__(self): ... return "__str__被调用" ... def __repr__(self): ... return "__repr__被调用" ... >>> mc = MyClass() >>> mc __repr__被调用 >>> print(mc) __str__被调用 >>> str(mc) '__str__被调用' >>> repr(mc) '__repr__被调用' """ """ 通常情况下,类对象的特殊方法__str__()和__repr__()的实现代码是一样的,因此, 当实现了其中一个后,可以把其方法名赋值给另一个的方法名 """ class MyClass(object): def __str__(self): return "xxx" __repr__ = __str__ """ 内置函数str()和repr()都返回对象的字符串表示,其区别在于: str()的返回值是给用户看的,对用户更加友好 repr()的返回值是给程序开发者看的,是为了调试服务的 >>> str("Hello,\nWorld!") 'Hello,\nWorld!' >>> repr("Hello,\nWorld!") "'Hello,\\nWorld!'" """
▽ 类对象的特殊方法之__new__()
"""二、类对象的特殊方法之__new__()""" """ 当使用"类名([实参])"创建实例对象时,python解释器的主要处理过程包括两大步: 1. 调用特殊方法__new__()创建实例对象 首先会查找该类对象是否实现了特殊方法__new__(),如果没有实现,则去其父类中依次查找, 直到类对象object 特殊方法__new__()会返回创建的实例对象 2. 调用特殊方法__init__()对创建的实例对象进行初始化 __new__()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self """ class Parent(object): def __new__(cls, *args, **kwargs): # 父类的__new__()被调用,其形参cls对应实参的id:140398668516112 print("父类的__new__()被调用,其形参cls对应实参的id:%s" % id(cls)) obj = super().__new__(cls) # object的特殊方法__new__()知道如何创建实例对象 print("创建的实例对象的id:%s" % id(obj)) # 创建的实例对象的id:4430051744 return obj class Child(Parent): def __init__(self, name): # 子类的__init__()被调用,其形参self对应实参的id:4430051744 print("子类的__init__()被调用,其形参self对应实参的id:%s" % id(self)) self.name = name print("父类的id:%s" % id(Parent)) # 父类的id:140398668515168 print("子类的id:%s" % id(Child)) # 子类的id:140398668516112 child = Child("Mike") print("创建的实例对象的id:%s" % id(child)) # 创建的实例对象的id:4430051744