• Python3-面向对象-魔术方法


    魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。
    格式:__名字__() --> 称之为魔术方法
     
    1.__init__
     1 """
     2 1.__init__
     3 初始化魔术方法
     4 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
     5 参数:至少有一个self,接收对象
     6 返回值:无
     7 作用:初始化对象的成员
     8 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
     9 """
    10 class Person:
    11     def __init__(self):
    12         self.name = 'Seele'
    13  
    14 p = Person()
    15 print(p.name) # Seele
    2.__new__
     1 """
     2 __new__
     3 实例化魔术方法
     4 触发时机: 在实例化对时触发
     5 参数:至少一个cls 接收当前类
     6 返回值:必须返回一个对象实例
     7 作用:实例化对象
     8 注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
     9 没事别碰这个魔术方法,先触发__new__才会触发__init__
    10 """
    11 class Person:
    12     def __init__(self,name):
    13         self.name = name
    14         print("------__init__------")
    15  
    16     def __new__(cls, *args, **kwargs):
    17         print("------__new__------")
    18         return super().__new__(cls)
    19  
    20 p = Person('Seele')
    21  
    22 """
    23 步骤:
    24 1.创建Person,分配空间
    25 2.进入__new__函数,创建内存地址给对象p
    26 3.将p的内存地址给__init__中的self
    27 4.执行__init__函数
    28 5.将结果返回给p
    29 """
    3.__str__
     1 """
     2 __str__:
     3 触发时机:使用print(对象)或者str(对象)的时候触发
     4 参数:一个self接收对象
     5 返回值:必须是字符串类型
     6 作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
     7 注意: 一定要在__str__中添加return,return后面的内容就是打印对象看到的内容
     8 """
     9 class Person:
    10     def __init__(self,name,age):
    11         self.name = name
    12         self.age = age
    13  
    14     def __str__(self):
    15         return "姓名:" + self.name + " 年龄:" + str(self.age)
    16  
    17 p = Person('Seele',16)
    18 print(p) # 姓名:Seele 年龄:16
    4.__call__
     1 """
     2 __call__
     3 调用对象的魔术方法
     4 触发时机:将对象当作函数调用时触发 对象()
     5 参数:至少一个self接收对象,其余根据调用时参数决定
     6 返回值:根据情况而定
     7 作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
     8 """
     9 class Person:
    10     def __init__(self,name):
    11         self.name = name
    12  
    13     def __call__(self, *args, **kwargs):
    14         print("调用__call__方法")
    15  
    16 p = Person("Selle")
    17 p() # 调用__call__方法
    5.__del__
     1 """
     2 __del__
     3 析构魔术方法
     4 触发时机:当对象没有用(没有任何变量引用)的时候被触发
     5 参数:一个self 接收对象
     6 返回值:无
     7 作用:使用完对象是回收资源
     8 注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发
     9  
    10 1.对象赋值:
    11 p = Person('Seele')
    12 p1 = p
    13 说明:p和p1共同指向同一个地址
    14 2.删除地址的引用:
    15 del p1 删除p1对地址的引用
    16 3.查看对地址的引用次数:
    17 import sys
    18 sys.getrefcount(p)
    19 4.当一块空间没有了任何引用,默认调用__del__
    20 """
    21  
    22 import sys
    23  
    24 class Person:
    25     def __init__(self,name):
    26         self.name = name
    27  
    28     def __del__(self): # 通常情况下,不对其进行编写,否则会覆盖系统默认的__del__方法
    29         print("------__del__------")
    30  
    31 p = Person('Seele')
    32 p1 = p
    33 p2 = p
    34  
    35 print(sys.getrefcount(p))
    36 # sys.getrefcount(p)返回p被引用的次数:4 --> p p1 p2 sys.getrefcount(p)
    37  
    38 del p1
    39 print(sys.getrefcount(p)) # 3
    40  
    41 del p2
    42 print(sys.getrefcount(p)) # 2
    43  
    44 s = 1
    45 print(s) # 此时p仍旧占用着空间,因此,先打印s的值
    46  
    47 del p
    48 # print(sys.getrefcount(p)) # 会报错:NameError: name 'p' is not defined 因为p被删除了
    49 # del p 没有任何一个引用指向该空间,此时__del__会被调用,打印"------__del__------"
    50  
    51 n = 5
    52 print(n) # 后打印n = 5
     
  • 相关阅读:
    20155313 2016-2017-2《Java程序设计》课程总结
    java第四次实验
    java第五次实验
    20155313 实验三《Java面向对象程序设计》实验报告
    20155313 2016-2017-2 《Java程序设计》第十周学习总结
    20155311《Java程序设计》实验五(网络编程与安全)实验报告
    学号20155311 2016-2017-2《Java程序设计》课程总结
    20155311高梓云补交的Mypc课下实践
    20155311 《Java程序设计》实验四 (Android程序设计)实验报告
    20155311 实验三 敏捷开发与XP实践 实验报告
  • 原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/12997436.html
Copyright © 2020-2023  润新知