目录
魔术方法
魔术方法就是一个类/对象中的方法,和普通方法唯一不同是普通方法需要调用,而魔术方法是在特定时刻自动触发。
#魔术方法
#__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__
'''