广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python深入讲解魔术方法
  • 283
分享到

python深入讲解魔术方法

2024-04-02 19:04:59 283人浏览 八月长安

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

摘要

目录一、python内置的基本魔术方法二、Python中容器类型的的魔术方法三、python中算数运算符的魔术方法什么是魔术方法(魔法方法/特殊方法) 魔术方法都不需要手动去调用是在

什么是魔术方法(魔法方法/特殊方法)

  • 魔术方法都不需要手动去调用
  • 是在特定的情况下触发的
  • 魔术方法都是在python事先定义好的,在定义方法的时候,不要使用魔术方法的命名规范
  • 魔术方法是双划线开头,双划线结尾的

一、python内置的基本魔术方法

init方法

init 是类在实例化时的方法

# 例如
class Mytest():
    def __init__(self):
        print("----这是魔术方法__init__")
	
Mytest()

call方法

__call__方法的作用 :实现对象可调用

1.没有实现 __call__方法时,对象是不可以被调用的

# 类
class Demo:
    pass
# 判断对象是否可被调用,有个函数可以使用——callable
print(callable(Demo))   ======》 返回True,可被调用
# demo类创建出来的对象是否可被调用,是不能的被调用的
obj = Demo()
obj()

执行结果:提示:‘Demo’ object is not callable ----- 没有__call__方法

2.如果要类创建对象出来的对象可别调用,就要用到__call__方法

class Demo:
    def __call__(self, *args,**kwds):
        print("这是__call__方法执行了")
print(callable(Demo))
# demo类创建出来的对象是否可被调用(不能被调用)
obj = Demo()

obj()          # 等同于:obj.__call__() 方法
obj()
obj()

new 方法

__new__方法的作用 : 是创建对象的方法

__init__方法的作用 : 是用来初始化对象的方法

类的对象要能被调用:

首要new方法创建对象,然后通过init方法初始化

什么时候会需要用到New方法:

干预类实例化对象的过程

注意点:

  • 一般情况不要重写new方法,除非有特定的需求需要使用new方法来实现
  • 定义了new方法之后,需要调用父类的new来创建对象 并返回
class MyTest(object):
    # 初始化对象
    def __init__(self):
        print('-------init------方法')
	# 创建对象
    def __new__(cls, *args, **kwargs):
        print('------new方法-------')
        obj = super().__new__(cls)        # 调用父类的new来创建对象
        return obj     # 并返回新的对象
obj = MyTest()

bool(self)方法

定义当被 bool() 调用时的行为,应该返回 True 或 False

class Demo:
    def __bool__(self):
        """内置函数bool(),获取对象的布尔值是会执行这个方法"""
        return True
b = Demo()       
# 获取对象的布尔值,返回True 或 False
print(bool(b))    =====》 返回 True

str(self)方法

使用print去输出对象时,输出到控制台的内容是由__str__来决定的

class Demo:
    def __str__(self):
        """
        使用print去输出对象时,输出到控制台的内容是由__str__来决定的
        """
      return 'zifuc'
b = Demo() 
# str方法
s = str('123')
print(s)    =======》 返回 123

repr(self)方法

这个方法也是控制对象显示的,一般会显示对象的原始信息

class Demo:
    def __repr__(self):
        """
        这个方法也是控制对象显示的,一般会显示对象的原始信息
        """
        return 'repr-number'
b = Demo()         
# repr方法
s = repr('123')
print(s)    =======》 返回 '123'

len(self)方法

获取对象的长度

class Demo:
    def __len__(self):
        """
        这个方法是获取对象的长度
        :return:
        """
        return 3
 b = Demo()       
# 获取对象的长度
print(len(b))    =====》 返回 3

hash(self)方法

返回对象的hash值

class Demo:
    def __hash__(self):
        """
        这个方法是获取hash值
        :return:
        """
        return 999
b = Demo()   
# 获取hash值
print(hash(b))    =====》 返回 999

二、python中容器类型的的魔术方法

setitem(self, key, value)方法

定义设置容器中指定元素的行为,语法:self[key] = value

class Mytest:
    def __setitem__(self, key, value):
        return setattr(self, key, value)
m = Mytest()
print(m.__dict__)     没有数据,为空字典
m.name = 'gddg'     ==== 》 设置name属性,值为gddg
m['age'] = 18      ==== 》 设置age属性,值为18

getitem(self, item)方法

定义获取容器中指定元素的行为,语法: self[key]

class Mytest:
    def __getitem__(self,item):
        return getattr(self,item)
m = Mytest()
print(m['name'])     ==== 》 name属性,值为gddg

delitem(self, item)方法

定义删除容器中指定元素的行为,相当于 del self[key]

class Mytest:
    def __delitem__(self,item):
        delattr(self,item)
m = Mytest()
del m['name']      ==== 》 删除name属性

contains(self, item)方法

定义当使用成员测试运算符(in 或 not in)时的行为, 返回 True 或 False

class MyTest:
    def __contains__(self, item):
        """成员运算符触发的魔术方法"""
        return True
a = MyTest()
b = MyTest()
print(a in b)   =======》 返回 True

迭代协议:__iter__方法

定义当迭代容器中的元素的行为

class IterClass:
    def __iter__(self):
        """
        __iter__方法的返回值必须是一个迭代器
        """
        return iter([11, 22, 33, 44])     ===== 》返回一个迭代器
li = IterClass()
for i in li :
	print(i )
for遍历对象:
    1、执行对象的__iter__方法(返回迭代器)
    2、在循环使用next对迭代器进行迭代

三、python中算数运算符的魔术方法

add(a,b)方法 和 sub(a,b)方法

a = 1
b = 2
print(a + b)    ======》 实际执行的是:a.__add__(a,b)
print(a - b)    ======》 实际执行的是:a.__sub__(a,b)

字符串类型的是否支持加减的操作

a = '123'
b = '12'
print(a + b)    ======》 实际执行的是:a.__add__(a,b)
print(a - b)    ======》 实际执行的是:a.__sub__(a,b)

对字符串对象没有实现__sub__方法,所以不支持对象直接使用 -

自己在重新定义__sub__方法,实现对字符串对象的减法

class MyStr(str):
    def __sub__(self, other):
        return self.replace(other, '')
a = MyStr('1234')
b = MyStr('123')
print(a + b)     ======= 》  返回 1234123
print(a - b)    ======= 》  返回 4

到此这篇关于python深入讲解魔术方法的文章就介绍到这了,更多相关python魔术方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python深入讲解魔术方法

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

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

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

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

下载Word文档
猜你喜欢
  • python深入讲解魔术方法
    目录一、python内置的基本魔术方法二、python中容器类型的的魔术方法三、python中算数运算符的魔术方法什么是魔术方法(魔法方法/特殊方法) 魔术方法都不需要手动去调用是在...
    99+
    2022-11-11
  • Python魔术方法深入分析讲解
    目录前言__init____new____call____del____str__总结前言 魔术方法就是一个类/对象中的方法,和普通方法唯一的不同是:普通方法需要调用,而魔术方法是在...
    99+
    2023-02-08
    Python魔术方法 Python魔术方法原理
  • pandas中df.groupby()方法深入讲解
    目录分组:根据研究目的,将所有样本点按照一个或多个属性划分为多个组,就是分组。分组的返回结果按一列分组:df.groupby(column)按多列分组:df.groupby([col...
    99+
    2022-12-20
    pandas的groupby函数 pandas df.groupby()方法 pandas groupby agg用法
  • python进阶之魔术方法详解
    目录一、三个内置函数二、双下划线开头和结尾的方法,叫魔术方法。总结一、三个内置函数 1、@classmethod–类名.属性名 2、@staticmethod&ndash...
    99+
    2022-11-12
  • Python学习【魔术方法】
    魔术方法 Python中,所有以双下划线“__”包围的方法(即定义在类中的函数)为魔术方法Magic Method。 构造和初始化 在使用classname()创造实例化对象时,会依次执行__new__和__init__两个方法。 __...
    99+
    2023-01-31
    魔术 方法 Python
  • php反序列化之魔术方法超详细讲解
    目录php魔术方法__construct()与__destruct()__call__get__set__isset__unset__sleep__wakeup__toString_...
    99+
    2022-11-13
    php反序列化魔术方法 php魔术方法
  • PHP入门指南:魔术方法
    PHP作为一种广泛应用的开发语言,具有着丰富的特性,它的魔术方法就是其中之一,本文将为大家介绍PHP中的魔术方法。一、什么是魔术方法?在PHP中,魔术方法是指一类可以自动调用的方法。这些方法使用特殊的名称,以双下划线(__)开头和结尾,并在...
    99+
    2023-05-20
    PHP 入门 魔术方法
  • python中魔术方法简述
    魔术方法:***实例化:new :实例化一个对象 方法很少使用,一般使用return super().))new(cls)基类ibject方法来创建实例并返回。 hash:返回一个整数,如果定义这个方法该类的实例就可hash。eq:...
    99+
    2023-01-31
    魔术 方法 python
  • python中类的魔术方法
    目的:学习python中class的magic methods,提高编程效率。环境:ubuntu 16.4   python 3.5.2在学习class时一定会接触到它的magic methods,比如常用__init__,形式都是前后有双...
    99+
    2023-01-31
    魔术 方法 python
  • python魔术方法是什么
    这篇文章主要介绍“python魔术方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python魔术方法是什么”文章能帮助大家解决问题。一、三个内置函数@classmethod&nda...
    99+
    2023-06-26
  • python魔术方法有哪些
    python魔术方法有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、类和对象通俗理解:类就是模板,对象就是通过模板创造出来的物体类(Class)由3个部...
    99+
    2023-06-15
  • php 之魔术方法详解
    ✨ 目录 🎈 构造方法 / __construct🎈 析构方法 / __destruct🎈 克隆方法 / __cloneἸ...
    99+
    2023-08-31
    php 开发语言 魔术方法 面向对象 经验分享
  • Python字典高级用法深入分析讲解
    目录一、 collections 中 defaultdict 的使用1.字典的键映射多个值2.统计字典中某个值出现的次数二、collections 创建有序字典1.改变 key-va...
    99+
    2022-11-11
  • Python魔方方法详解
    原文链接: https://fishc.com.cn/forum.phpmod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403 魔...
    99+
    2023-01-31
    魔方 详解 方法
  • Java深入探究讲解工厂方法模式
    目录1. 工厂方法模式介绍2. 工厂方法模式类图UML3. 工厂方法模式角色说明4. 代码实现5. 工厂模式再探究6. 优缺点7. 应用场景1. 工厂方法模式介绍 定义:工厂方法模式...
    99+
    2022-11-13
  • Java深入浅出讲解String类常见方法
    目录1.定义字符串2.字符串的存储3.String中常用的方法3.1字符串的比较3.2查找字符串3.3转换字符串4.StringBuilder和StringBuffer5.常量池1....
    99+
    2022-11-13
  • Python 魔法方法详解
    据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Py...
    99+
    2023-01-31
    详解 方法 魔法
  • python如何使用魔术方法
    这篇文章主要为大家展示了“python如何使用魔术方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何使用魔术方法”这篇文章吧。魔术方法魔术方法可...
    99+
    2022-10-19
  • python魔术方法之装饰器
    三个魔术方法:__get__()__set__()__delete__()object.__get__(self,实例名,owner)    #owner = 属主 ,instance = 属主类owner的实例object.__set__...
    99+
    2023-01-31
    魔术 方法 python
  • 介绍Python的魔术方法 - Mag
    前言 在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法"。比如我们接触最多的__init__. 有些魔术方法,我们可能以后一辈子都不会再遇到了,这里也就只是简单介绍下; 而有些魔术方法,巧妙使用它可以构造出非常优美的代...
    99+
    2023-01-31
    魔术 方法 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作