栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python】魔术方法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python】魔术方法

【python】魔术方法

文章目录
    • 【python】魔术方法
  • 前言
  • 一、初始化方法__init__
  • 二、构造方法__new__
  • 三、析构方法__del__
  • 四、__str__
  • 五、其他


前言 python面向对象的类中不需要调用而在特定情况下自动触发的方法叫做“魔术方法”
一、初始化方法__init__

·触发机制:通过类实例化对象后,自动触发
·作用:初始化,如属性的赋值
·参数: self接收当前对象,可添加其他参数

class Person:
    def __init__(self, name,age):             
        self.name = name
        self.age=age
        print('=========>init')
#实例化
p=Person('小红',10)
print(p.name,p.age)
'''  
输出:
=========>init
小红 10
'''
二、构造方法__new__

·触发机制:实例化对象时就自动触发,在__init__之前
·作用:管理控制对象的创建过程
·参数: cls接收当前类,其他参数根据初始化方法的参数进行决定
·返回值: 可有可无,没有返回值的时候,实例化结果为None。即想要创建对象,则必须返回object.new(cls)<----开辟的新地址
·注意:__new__的参数要和__init__的参数保持一致,除了(slef和cls不一样),必须返回object.new(cls)才能实例化对象
·应用:单例模式

class Person:
    def __init__(self, name,age):             
        self.name = name
        self.age=age
        print('=========>init',self)
    def __new__(cls, *args, **kwargs):     #作用:负责开辟地址,返回地址给self,为了和__init__的参数保持一致,最好写成不定参数*args,**kwargs
        print('=========>new')
        address=object.__new__(cls)        #开辟空间
        print(address)
        return address                     #返回地址给 __init__的 self
#实例化
p=Person('小红',10)
print(p)
'''
输出:
=========>new
0x0000021A5AC3FAF0
=========>init  0x0000021A5AC3FAF0
0x0000021A5AC3FAF0
'''

可以发现self的地址和address以及p对象的地址相同的,若是__new__不开辟地址,则实例化结果就是None,即不会成功实例化:

class Person:
    def __init__(self, name,age):             
        self.name = name
        self.age=age
        print('=========>init',self)
    def __new__(cls, *args, **kwargs):    
        print('=========>new')
#实例化
p=Person('小红',10)
print(p)
'''
输出:
=========>new
=========>init  None
None
'''
三、析构方法__del__

(1)对象赋值:p=Person(),p1=p,只要有对象赋值,说明p与p1指向同一地址
(2)删除地址的引用:del p 删除p对对地址的引用
(3)查看地址的引用次数:count=sys.getrefcount( p)
(4)当一块空间没有任何引用次数的时候,默认执行__del__.出现‘仍有引用时,仍打印__del__’的解释:python解释器会回收在本次执行过程中使用的所有空间,清空后,自然会调用__del__

class Person:
    def __init__(self, name,age):             
        self.name = name
        self.age=age
        print('=========>init')
    def __new__(cls, *args, **kwargs):    
        print('=========>new')
        address=object.__new__(cls)        #开辟空间
        return address                     #返回地址给 __init__的 self
    def __del__(self):
        print('========>end')
#实例化
p=Person('小红',10)
'''
输出:
=========>new
=========>init
========>end   解释器回收对象,触发__del__
'''
四、str

·触发机制:在打印对象print(obj)时,触发
·作用:打印对象print(obj)时返回想要得到的信息

class Person:
    def __init__(self, name,age):             
        self.name = name
        self.age=age
        print('=========>init')
    def __new__(cls, *args, **kwargs):    
        print('=========>new')
        address=object.__new__(cls)        #开辟空间
        return address                     #返回地址给 __init__的 self
    def __del__(self):
        print('========>end')
    def __str__(self):
        return '__str__'+self.name        # 返回想要看到任何的内容
#实例化
p=Person('小红',10)
prin(p)
'''
输出:
=========>new
=========>init
'__str__'小红
========>end   解释器回收对象,触发__del__
'''
五、其他

。。。。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275401.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号