iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python常用的魔法方法(双下划线)
  • 241
分享到

python常用的魔法方法(双下划线)

2024-04-02 19:04:59 241人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言魔法方法__init__方法__new__方法__call__方法__str___方法__del___方法__enter__ & __exit__方法item系列方法

前言

本文介绍一下python中常用的魔法方法以及面向对象中非常重要的单例模式。

魔法方法

Python中一切皆对象,因为python是面向对象的编程语言。python给类和对象提供了大量的内置方法,这些内置方法也称魔法方法。这些魔法方法总是在某种条件下自动触发执行,就像魔法一样。

__init__方法

该方法是用来接收定义类时类中__new__方法返回的空对象后为空对象进行初始化的操作,没有返回值。


class Test():
    def __init__(self, name):
        self.name = name
        
    def test(self):
        print(self.name)
   
t = Test('xu')
t1 = Test('python')

__new__方法

该方法是当类被调用实例化对象时首先被触发的方法,用来实例化一个空对象并返回。


class Test():
    def __new__(cls,*args, **kwargs):
        return object.__new__(cls, *args, **kwargs) 
    
    def __init__(self, name):
        self.name = name

__call__方法

如果想让一个对象变成一个可调用对象(加括号可以调用),需要在该对象的类中定义__call__方法,调用可调用对象的返回值就是__call__方法的返回值。


class Test():
    
    def __init__(self):
        self.name = 'python'
    
    def __call__(self, *args, **kwargs):  # self是Test类的对象
        print(self)  # <__main__.Test object at 0x000001C78CE78FD0>
        print(self.name)
        
t = Test()
t()  # python

__str___方法

当对象被访问打印时触发执行,该方法必须有一个字符串类型的返回值。


class Test():
    def __init__(self, name):
        self.name = name
 
    def __str__(self):
        return self.name
   
t = Test('xu')
print(t1)  # xu

__del___方法

__del__方法是在对象被删除时自动触发,由于python的垃圾回收机制会自动清理程序中没用的资源,因此如果一个对象只是占用应用程序的资源,没有必要定义__del__方法,但是如果设计到占用系统资源的话比如打开的文件对象,由于关系到操作系统的资源,python的垃圾回收机制派不上用场的时候,就需要为对象创建__del__方法,用于对象被删除后自动触发回收操作系统资源。


class Test:
    def __init__(self):
        self.x = open('a.txt',mode='w')
        # self.x = 占用的是操作系统资源

    def __del__(self):
        print('run')
        # 发起系统调用,告诉操作系统回收相关的系统资源
        self.x.close()

obj = T()
del obj # obj.__del__() 

__enter__ & __exit__方法

使用with上下文管理时,会触发对象中的__enter__方法,并将__enter__方法的返回值赋值给as声明的变量。
with语句正常结束的时候会触发__exit__方法,该方法的三个参数分别代表异常类型、异常值和溯源信息,如果with语句代码块出现异常,则with语句后的代码都不会被执行,但是如果该方法返回值为True,异常会被清空,with代码块后的代码还会被正常执行。代码如下:


class Open:
    def __init__(self):
        self.name = 'open'

    def __enter__(self):
        print('with语句执行时会首先执行的方法,返回值会赋值给as声明的变量')
        return self.name

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中的代码块执行完毕时执行exit')
        print(exc_type, '如果出现异常表示异常类型')
        print(exc_val, '表示异常的值')
        print(exc_tb, '表示异常的溯源信息')
        return 123  # 非零 非空 非None为真

    
with Open() as test:
    print(test)
    raise TypeError('看一下错误信息')
print('我会不会被执行呢')  # 当__exit__方法返回值为真时,会被执行,否则不会被执行

item系列方法

item系列方法包括__setitem__、__getitem__、delitem__方法,这三种方法分别会在中括号赋值/修改值、中括号取值、中括号删除值时触发,比如可以自定义一个字典类,并自定义中括号赋值、取值、删除值的方法:


class MyDict(dict):

    def __setitem__(self, key, value):
        print('执行setitem', key, value)  # 执行setitem, x, 1
        self.__dict__[key] = value

    def __getitem__(self, item):
        print('执行getitem', item)  # 执行getitem x
        print(self.__dict__[item])  # 1

    def __delitem__(self, key):
        print('执行delitem', key)  # 执行delitem x
        self.__dict__.pop(key)


d = MyDict()
d['x'] = 1
print(d['x'])
del d['x']

attr系列方法

attr系列方法包括__setattr__,__getattr__,__delattr__,__setattr__在添加/修改属性时会触发,___delattr__删除属性的时候触发,__getattr__在使用.调用属性并且属性不存在时触发。如下代码所示


class Test:
    def __init__(self):
        self.name = 'python'

    def __setattr__(self, key, value):
        print('添加/修改属性setattr')
        self.__dict__[key] = value
        # self.key = value  # 会出现无线递归,因为对象.属性会调用__setattr__方法

    def __delattr__(self, item):
        print('删除属性delattr')
        self.__dict__.pop(item)

    def __getattr__(self, item):
        print('属性不存在时调用getattr')
t = Test()
t.x = 'x'
print(t.y)
del t.x

单例模式

单例模式是一种软件设计模式,为了保证一个类无论调用多少次产生的对象都指向同一个内存地址,即仅仅只有一个对象。
实现单例模式的方式有很多,总的原则就是保证一个类只要实例化一个对象,因此关键点就是如何判断这个类是否实例化过一个对象。

这里介绍几种实现方式,供大家参考:

模块导入的方式

这种方式的原理是模块导入后只运行一次,后面再次使用该模块中的类是直接从内存中查找。


# cls_singleton.py
class Foo(object):
    pass

instance = Foo()

# test.py
import cls_singleton

obj1 = cls_singleton.instance
obj2 = cls_singleton.instance
print(obj1 is obj2)  # True

通过__new__方法

原理就是判断类是否有实力,有就直接返回,没有就保存到_instance中


class Test:

    _instance = None

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        # if cls._instance:
        #     return cls._instance                 # 有实例则直接返回
        # else:
        #     cls._instance = super().__new__(cls) # 没有实例则new一个并保存
        #     return cls._instance                 # 这个返回是给是给init,再实例化一次,也没有关系

        if not cls._instance:                         # 这是简化的写法,上面注释的写法更容易提现判断思路
            cls._instance = super().__new__(cls)
        return cls._instance


t1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2)  # True

自定义元类的方式

这种方式的原理是类调用的过程,类定义时会调用元类下的__init__,类调用(实例化对象)时会触发元类下的__call__方法。


class Mymeta(type):

    def __init__(cls, name, bases, dic):
        super().__init__(name, bases, dic)
        cls._instance = None                    # 将记录类的实例对象的数据属性放在元类中自动定义了

    def __call__(cls, *args, **kwargs):                   # 此call会在类被调用(即实例化时触发)
        if cls._instance:      # 判断类有没有实例化对象
            return cls._instance
        else:        # 没有实例化对象时,控制类造空对象并初始化
            obj = cls.__new__(cls, *args, **kwargs)
            obj.__init__(*args, **kwargs)
            cls._instance = obj             # 保存对象,下一次再实例化可以直接返回而不用再造对象
            return obj


class Test(metaclass=Mymeta):
    def __init__(self, name, age):
        self.name = name
        self.age = age


t1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2)  # True

结语 

到此这篇关于python常用的魔法方法(双下划线)的文章就介绍到这了,更多相关python 魔法方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python常用的魔法方法(双下划线)

本文链接: https://www.lsjlt.com/news/134296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python常用的魔法方法(双下划线)
    目录前言魔法方法__init__方法__new__方法__call__方法__str___方法__del___方法__enter__ & __exit__方法item系列方法...
    99+
    2024-04-02
  • 详解Python单下划线和双下划线使用
    在Python编程中,我们经常会遇到单下划线(_)和双下划线(__)的使用。它们在命名标识符、变量、方法和属性中扮演着不同的角色。本文将详细解释Python中单下划线和双下划线的含义和用法,并通过...
    99+
    2023-09-17
    python 开发语言 算法
  • 总结Python常用的魔法方法
    目录一、算数运算符的魔法方法二、反运算相关的魔法方法三、增量赋值运算四、一元操作符一、算数运算符的魔法方法 python2.2以后,对类和类型进行了统一,做法就是讲int(...
    99+
    2024-04-02
  • 详解Python常用的魔法方法
    目录一、python魔法方法二、运算符重载三、打印操作的魔法方法四、属性操作的魔法方法五、描述符六、定制序列七、迭代器一、python魔法方法 Python的魔法方法会在特定的情况下...
    99+
    2024-04-02
  • Python常用的魔法方法是什么
    这篇文章将为大家详细讲解有关Python常用的魔法方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、python魔法方法Python的魔法方法会在特定的情况下自动调用,且他们的方法名通常被双下划...
    99+
    2023-06-15
  • 常用的Python魔法方法有哪些
    这期内容当中小编将会给大家带来有关常用的Python魔法方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、算数运算符的魔法方法python2.2以后,对类和类型进行了统一,做法就是讲int()、...
    99+
    2023-06-15
  • python中双下划线的作用是什么
    python中双下划线的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(...
    99+
    2023-06-14
  • css去掉下划线的方法
    这篇文章将为大家详细讲解有关css去掉下划线的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css去掉下划线的方法:可以利用text-decoration属性来实现,如【text-decoration...
    99+
    2023-06-08
  • css设置下划线的方法
    这篇文章将为大家详细讲解有关css设置下划线的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css设置下划线的方法:首先创建一个HTML示例文件;然后在body中定义一些文字内容;最后通过“text-...
    99+
    2023-06-14
  • css取消下划线的方法
    这篇文章给大家分享的是有关css取消下划线的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css中,可以使用“text-decoration”属性取消下划线,只需要给元素设置“text-decoration:...
    99+
    2023-06-14
  • python变量中单下划线和双下划线的区别是什么
    python变量中单下划线和双下划线的区别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、变量的定义在Python中,有以下几种方式来定义变量:xx:公有变量_xx:前...
    99+
    2023-06-02
  • Python中私有属性下划线和双下划线的区别是什么
    今天小编给大家分享一下Python中私有属性下划线和双下划线的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在Py...
    99+
    2023-07-05
  • python 函数、变量中单下划线和双下划线的区别详解
    目录一、_func 单下划线开头 --口头私有变量1.1、在模块中使用单下划线开头1.2、在类中使用单下划线开头二、__func 双下划线开头的函数 --私有变量2.1、在模块中使用...
    99+
    2023-01-28
    python 单下划线 python 双下划线 python单下划线和双下划线
  • html中设置下划线的方法
    这篇文章主要介绍了html中设置下划线的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html设置下划线的方法:1、通过“text-decoration”属性给文字添加下...
    99+
    2023-06-15
  • 聊聊Python中常见魔法方法
    ​什么是魔法方法?魔法方法(Magic Methods)是Python中的内置函数,一般以双下划线开头和结尾,例如__init__、__del__等。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用。在Python中,可...
    99+
    2023-05-15
    代码 Python 魔法方法
  • html下划线颜色的修改方法
    这篇文章将为大家详细讲解有关html下划线颜色的修改方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。方法:1、给元素设置“text-decoration:underline;color:颜色值”样式即可...
    99+
    2023-06-15
  • python里面单双下划线的区别详解
    区别: xx:公有变量,所有对象都可以访问;xxx:双下划线代表着是系统定义的名字。__xxx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问。代表着类中的私有变量名。...
    99+
    2023-05-17
    python 单双下划线区别 python 单下划线 python 双下划线
  • python中有哪些常用的魔术方法
    这篇文章将为大家详细讲解有关python中有哪些常用的魔术方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比...
    99+
    2023-06-14
  • python中的单下划线与双下划线以及绝对导入与相对导入
    目录单下划线与双下划线绝对导入与相对导入硬编码的概念单下划线与双下划线 在 python 中,会看到 _xx, xx 以及 __xx 这样的变量或者函数名,在这里做一个简要的总结。 ...
    99+
    2024-04-02
  • css设置下划线的方法有哪些
    本篇内容主要讲解“css设置下划线的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css设置下划线的方法有哪些”吧!1、文字带下划线的方式显示 &nb...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作