Python进阶(15)—类对象的特殊方法(2)

◎知识点

  1. 类对象的特殊方法之__str__()__repr__()

  2. 类对象的特殊方法之__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

Python进阶(15)—类对象的特殊方法(2)


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_advanced/special_methods2.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5304.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注