python常用魔术方法 (repr str call)

repr和str的区别

https://blog.csdn.net/LIFENG0402/article/details/121567390

 

class People:  # 类名Person后面加不加(Object)效果是一样的,都表示继承自Object类
    # 创建对象
    def __new__(cls, *args, **kwargs):
        print("调用__new__构造方法")
        position = super().__new__(cls)  # 调用父类的__new__()方法创建对象,开辟内存空间
        # print(position)  # <__main__.People object at 0x7fa19b8a6c10>
        return position  # 将创建的地址空间对象返回,交给__init__方法接收

    # 实例化对象
    def __init__(self, name, age):
        self.name = name  # 在__new__方法返回的内存空间地址中放置name属性
        self.age = age  # 在__new__方法返回的内存空间地址中放置age属性
        # print(self)  # <__main__.People object at 0x7fa19b8a6c10>
        print("调用__init__初始化方法")

    # 对象作为函数调用时的逻辑
    def __call__(self, args):
        print("调用__call__方法,接收到的参数为:%s" % args)

    # 删除对象: 在(del 对象名后所对应的地址空间无任何引用时)或者程序执行结束之后
    def __del__(self):
        print("调用__del__析构方法,删除对象,释放内存空间")

    # 自定义print(对象名)时的输出内容
    def __str__(self):
        return '对象的name是:' + self.name + ',对象的age是:' + str(self.age)


if __name__ == '__main__':
    p = People('liuming', 20)
    # print(p)  # <__main__.People object at 0x7fa19b8a6c10>
    p('abc')  # 调用__call__方法
    p1 = p
    p2 = p
    p3 = p  # 截止到这里p对象所在的地址空间,共有4个对象都在引用,分别是对象:p,p1,p2,p3
    del p3  # 删除的是p3对内存地址空间的引用关系,此时p对象所在的地址空间,共有3个对象在引用,分别是对象:p,p1,p2
    del p2
    del p1
    del p  # 自动调用__del__方法,因为p对象所在的地址空间已经没有任何对象在引用了,所以需要对内存地址进行回收释放
    p4 = People('xiaohong', 18)
    print(p4)  # 对象的name是:xiaohong,对象的age是:18---注意:此时输出的不再是地址空间值了,而是__str__函数自定义return的内容
    print(str(p4))  # 输出内容同print(p4)

 

posted @ 2022-09-18 09:38  Tomorrow1126  阅读(15)  评论(0编辑  收藏  举报