类实例化时魔法方法调用顺序

class Student(object):
    def __new__(cls, *args, **kwargs):
        print('__new__')
        return object.__new__(cls)   # 必须返回父类的__new__方法,否则不不执行__init__方法,无法创建实例
 
    def __init__(self,name):
        print('__init__')
        self.name = name
 
    def __str__(self):                # 作用:打印实例时显示指定字符串,而不是内存地址
        print('__str__')
        return self.name
 
    def __call__(self, *args, **kwargs):        # 当执行C()(*args) 或者 s1(*args) 就会执行__call__
        print('__call__',*args)
 
    def __del__(self):                # 作用:清除无用的实例对内存的暂用
        print('__del__')
 
#1、实例化时机会执行__new__、__init__
s1 = Student('tom')
 
#2、执行 实例()  就会执行__call__ 方法,并将参数传递给__call__函数
s1('call01')
 
#3、当打印实例时就会执行 __str__ 方法下返回的字符串(默认返回的实例地址)
print(s1)
 
#4、析构方法:当删除实例时就会调用 __del__ 方法
del s1
# 析构方法作用:在程序结束后会自动执行析构方法删除所有实例
# 但是在程序运行时有很多实例是无用的,但是python内存回收机制却不会自动删除他们,这样就浪费内存
# 我们可以执行 del s1 ,那么在程序运行时,python内存回收机制会检测到这些实例时无用的,才会删除
# 其实我们执行del s1,并没有回收内存,只不过是摘除门牌号,python内存回收机制发现没有门牌号后会自动回收内存
上一篇:c语言 11-8


下一篇:列表常用操作