python高级知识之常用的魔术方法

这篇具有很好参考价值的文章主要介绍了python高级知识之常用的魔术方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言:魔法方法(Magic Method)是python内置方法,格式为:“__方法名__”,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数

1、init()魔术方法

对象初始化时执行__init__

class Test:

    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("名字:" + self.name)
        print("年龄:" + self.age)


if __name__ == '__main__':
    a = Test("小李", "18")
-------输出结果---------
名字:小李
年龄:18

上面示例会发现:__init__方法会在类实例化的时候自动调用,无需手动执行;

2、new()魔术方法

对象初始化时执行__new__,目的是为该对象分配内存空间。
对象初始化时一般先执行__new__,再执行__init__,看下面示例:

class Test:
    def __new__(cls, *args, **kwargs):
        print("我是__new__方法")
        obj = object.__new__(cls)
        print(obj)
        return obj

    def __init__(self):
        print(self)
        print("我是__init__方法")


if __name__ == '__main__':
    a = Test()
    
-------输出结果---------
我是__new__方法
<__main__.Test object at 0x123902f70>
<__main__.Test object at 0x123902f70>
我是__init__方法

上面示例会发现:
1)__new__魔术方法返回的就是self的内存地址;
2)如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行;
3)如果不在__new__方法里面return创建好的对象,__init__不会被执行;

3、str()魔术方法

打印一个对象的时候,默认调用

class Test:

    def __init__(self):
        pass

    def __str__(self):
        return "test_name"


if __name__ == '__main__':
    a = Test()
    print(a)
-------输出结果---------
test_name

上面示例会发现:
1)操作类实例的时候自动化调用__str__,即print对象时,对象输出的样子;
2)还有一个魔术方法__repr__,与__str__类似,当同时出现时,str__优先级高于__repr

4、del()魔术方法

对象被删除的时候调用该方法

class Test:

    def __init__(self):
        print("初始化对象")

    def __del__(self):
        print("对象被删除了")


if __name__ == '__main__':
    a = Test()
    print("end")
-------输出结果---------
初始化对象
对象被删除了

上面示例会发现:
1)对象在内存中被释放时,自动触发执行;
2)此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的

5、call()魔术方法

对象当作函数执行时会被默认自动调用

class Test:

    def __call__(self, *args, **kwargs):
        print("调用了__call__")


if __name__ == '__main__':
    a = Test()
    a()
-------输出结果---------
调用了__call__

上面示例会发现:把类实例当成函数执行的时候会触发__call__方法,对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

6、len()魔术方法

调用len()函数的时候自动调用

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

    def __len__(self):
    	# 实例有自己的__dict__属性,__dict__是一个字典,键是属性名,值为属性值
        return len(self.__dict__)

if __name__ == '__main__':
    t = Test("狗子", 22)
    print(len(t))
-------输出结果---------
2

上面示例会发现:调用len()函数的时候自动调用,用来计算对象的长度

7、eq()魔术方法

调用相等判断的时候自动调用

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

    def __eq__(self, other):
        print(self.age)
        print(other.age)
        return self.age == other.age


if __name__ == '__main__':
    t1 = Test("狗子", 22)
    t2 = Test("小李", 23)
    print(t1 == t2)
-------输出结果---------
22
23
False

8、hash()魔术方法

调用hash()方法时自动调用\

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

    def __hash__(self):
        return hash(self.name)


if __name__ == '__main__':
    t = Test("狗子", 22)
    print(hash(t))
-------输出结果---------
902838481588431200

注意:只有不可变数据类型才有哈希值

9、getitem()魔术方法

获取实例属性的时候自动调用

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

    def __getitem__(self, item):
        return self.__dict__[item]


if __name__ == '__main__':
    t = Test("狗子", 22)
    print(t['name'])
-------输出结果---------
狗子

10、setitem()魔术方法

用于设置对象属性

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

    def __setitem__(self, key, value):
        self.__dict__[key] = value


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}

11、delitem()魔术方法

删除对象属性时调用

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

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        self.__dict__.pop(key)


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
    del t['name']
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}

12、delattr()魔术方法

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

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delattr__(self, item):
        self.__dict__.pop(item)


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
    del t.name
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}

注意:__delitem__和__delattr__都是删除对象的属性,但是其用法不一样,注意看上面2个示例。

13、add()/sub()魔术方法

运算符执行计算时调用文章来源地址https://www.toymoban.com/news/detail-502101.html

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

    def __add__(self, other):
        return self.age + other.age

    def __sub__(self, other):
        return self.age - other.age


if __name__ == '__main__':
    t1 = Test(22)
    t2 = Test(23)
    print(t1 + t2)
    print(t1 - t2)

到了这里,关于python高级知识之常用的魔术方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python魔术方法

    Python实用教程_spiritx的博客-CSDN博客 所有以双下划线 __ 包起来的方法,统称为 Magic Method(魔术方法) ,它是一种的特殊方法,普通方法需要调用,而魔术方法不需要 显示 调用就可以执行。 魔术方法在类或对象的某些事件出发后会自动执行,让类具有神奇的“魔力”。如果

    2024年02月10日
    浏览(45)
  • 深入理解 python 虚拟机:魔术方法之数学计算

    在本篇文章当中主要给大家介绍在 python 当中一些常见的魔术方法,本篇文章主要是关于与数学计算相关的一些魔术方法,在很多科学计算的包当中都使用到了这些魔术方法。 当我们在Python中定义自己的类时,可以通过重写一些特殊方法来改变对象的比较行为。这些特殊方法

    2024年02月05日
    浏览(40)
  • Elasticsearch的基础知识和架构设计,以及一些常用的功能——面向对象编程和数据结构的高级应用场景,以及相应的代码实现方法和工具

    作者:禅与计算机程序设计艺术 2019年,Elasticsearch正式发布了7.0版本。在这个版本更新中,新增了许多新特性和功能,包括全文搜索、分类聚合、分析器、图形化数据可视化等。无论对于企业或个人来说,都意味着更好的应用场景。但是,掌握Elasticsearch并非易事,需要不断学

    2024年02月07日
    浏览(50)
  • 深入理解 python 虚拟机:花里胡哨的魔术方法

    在本篇文章当中主要给大家介绍在 cpython 当中一些比较花里胡哨的魔术方法,以帮助我们自己实现比较花哨的功能,当然这其中也包含一些也非常实用的魔术方法。 在 Python 中, __hash__() 方法是一种特殊方法(也称为魔术方法或双下划线方法),用于返回对象的哈希值。哈希

    2024年02月06日
    浏览(43)
  • Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

    当前版本号[20230806]。 版本 修改说明 20230806 初版 生活中数据的组织 学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填, 易出现内容混乱 但当改为登记表,打印出来让学生自行填写, 就会整洁明了 程序中数据的组织 在程序中简单使用变量来记录学

    2024年02月14日
    浏览(49)
  • 毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言

    资源链接:https://download.csdn.net/download/m0_46573428/87796553 前言:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言_人工智能技术小白修炼手册的博客-CSDN博客 首页与导航:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前端:首页与导航栏_人工智

    2024年02月14日
    浏览(47)
  • python实现的一些方法,可以直接拿来用的那种

    很多时候我们需要批量生成日期,方法有很多,这里分享两段代码 获取过去 N 天的日期: 输出: 生成一段时间区间内的日期: 输出: 保存数据到 CSV 是太常见的操作了 Pyecharts 作为 Echarts 的优秀 Python 实现,受到众多开发者的青睐,用 Pyecharts 作图时,使用一个舒服的背景也

    2024年02月10日
    浏览(36)
  • 记录-VUE中常用的4种高级方法

    provide/inject 是 Vue.js 中用于跨组件传递数据的一种高级技术,它可以将数据注入到一个组件中,然后让它的所有子孙组件都可以访问到这个数据。通常情况下,我们在父组件中使用 provide 来提供数据,然后在子孙组件中使用 inject 来注入这个数据。 使用 provide/inject 的好处是可

    2024年02月03日
    浏览(31)
  • 高级编程,JavaScript笔记-字符串的常用方法

    我们也可将字符串常用的操作方法归纳为增、删、改、查,需要知道字符串的特点是一旦创建了,就不可变 增 这里增的意思并不是说直接增添内容,而是创建字符串的一个副本,再进行操作 除了常用 + 以及 ${} 进行字符串拼接之外,还可通过 concat concat 用于将一个或多个字

    2024年01月23日
    浏览(44)
  • 组合,反射,魔术方法

    组合 反射 魔术方法

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包