day17--魔术方法

目录

魔术方法

魔术方法就是一个类/对象中的方法,和普通方法唯一不同是普通方法需要调用,而魔术方法是在特定时刻自动触发。
在这里插入图片描述
在这里插入图片描述

#魔术方法
#__init__  初始化的魔术方法
#__new__   实例化的魔术方法
#__call__ 对象调用方法(当把对象当成函数来使用时触发)
#__del__ 析构魔术方法(当对象没有被任何变量引用时触发)
'''
地址产生顺序
1.__new__
2.__init__
3.p=Person()

'''
class Person:
    def __init__(self):
        print('---->init')
        print(self)

    def __new__(cls, *args, **kwargs):#一般不要重写
        print('----->new')
        positon= object.__new__(cls,*args,**kwargs)
        print(positon)
        return positon
        #一定有return,将开辟空间的内存地址返回给__init__,执行完__init后
        #再给对象p赋值这个地址

    def __call__(self, *args, **kwargs):
        print('----->call')
        print('执行对象得到的参数是:',*args)


p=Person()#实例化一个对象,首先会去调用Object的__new__创建一个空间,
# 将内存地址传给__init__的self,然后就初始化对象,调用这个类本身的__init__
print(p)

p('hello')#把对象当成函数来使用,则需要重写__call__
'''
----->new
<__main__.Person object at 0x000002473DAB3CC0>
---->init
<__main__.Person object at 0x000002473DAB3CC0>
<__main__.Person object at 0x000002473DAB3CC0>
----->call
执行对象得到的参数是: hello
'''
import sys
'''
__del__:
    1.对象赋值
        p=Person()
        p1=p
        p与p1共同指向同一个地址
    2.删除地址的引用
        del p1 删除p1对地址的引用
    3.查看对地址引用的次数:
        import sys
        sys.getrefcount(p)
    4.当一块空间没有任何引用时才会去调用__del__
    当程序执行完了,python解释器就会回收所有在本次执行中开辟的空间,以供垃圾回收。
    因此即使你不主动del删掉引用,当程序执行完引用也会变为0,因此__del__里的语句通常会在最后出现(程序执行完),
    当然,如果在程序结束前人为把引用都删掉了,也是会提前出现__del__里面的语句的
'''
class Person:
    def __init__(self,name):
        self.name=name

    def __del__(self):##他会在最后一句才执行它的函数体
        print('----删除一个引用---')


p=Person('jack')
p1=p
p2=p
print(p1.name)
print(p2.name)
p1.name='tom'
print(p.name)
print(p2.name)


print(sys.getrefcount(p))#4次引用 p,p1,p2,以及这条语句。因此有三个变量引用这个地址
print('准备删除引用p1')
del p2#断掉p2对这个的引用
print(sys.getrefcount(p))
print(p.name)
# print(p2.name)此时会报错了

'''
jack
jack
tom
tom
4
准备删除引用p1
3
tom
----删除一个引用---

'''
print('准备删除引用p1')
del p1
print(sys.getrefcount(p))
print(p.name)
print('准备删除引用p')
#下面三句话会导致报错,但是仍然会执行--删除一个引用
# del p
# print(sys.getrefcount(p))
# print(p.name)
#魔术方法之__str__
'''
触发时机:打印对象名时,自动触发去调用__str__里面的内容
注意一定要加return

'''
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):#类似于java的toString,这样我们每次打出这个对象,都是它的内容而不是地址
        return '姓名是:'+self.name+',年龄:'+str(self.age)

p=Person('tom',13)
print(p)#姓名是:tom,年龄:13

p1=Person('tonny',15)
print(p1)#姓名是:tonny,年龄:15
#如果单词打印对象名称,出来的是一个地址
#对__str__重写,此时打印对象名后出来的信息就是__str__里面的东西


'''
总结魔术方法

重点:
__init__(构造方法,创建完空间后调用的第一个方法)  
__str__(toString方法)

了解:
__new__ 作用:开辟空间
__del__ 作用:没有指针引用的时候会调用,98%不需要重写该方法
__call__ 作用:想不想把对象当成函数用

大总结:
方法:
    1、普通方法
        def 方法名(self[,参数])
        方法体
        
    对象.方法    
    
    2、类方法
    @classmethod
    def 方法名(cls[,参数]):
        pass
    
    类名.方法名()
    对象.方法名()
    
    3、静态方法
    @staticmethod
    def 方法([参数]):
        pass
    类名.方法名()
    对象.方法名()
    
    4、魔术方法
    自动执行的方法
    print(p)---> __str__
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值