python 面向对象进阶之魔术方法

本贴最后更新于 1178 天前,其中的信息可能已经事过境迁

python面向对象之魔术方法

前言

相信很多使用python的小伙伴都有一个困惑,在看一些库的源码时,发现源码中有很多 __XX__(双下划线开头,双下划线结尾)的方法。比如我们在定义类时,经常用到的初始化方法__init__,在python中像__init __这类双下划线开头和结尾的方法,我们把它统称为魔术方法(也有叫魔法方法和特殊方法的)。 今天就专门和大家一起来聊聊python中的魔术方法,首先我们来看看魔术方法有哪些特征。

接下来我们一起看看python中场景的一些魔术方法。

1、__new__方法

相信大多的程序员,都听说过 new一个对象这句话(如下图),

1557737976027.png

在很多的编程语言中创建对象都是使用的new来创建的,那么在咱们python中呢?其实也有一个new,它是一个魔术方法,接下来我们一起来看看。

2、上下文管理器

相信很多小伙伴都用过python中的with,也都指定可以同它来操作文件,文件会自动关闭。那么大家有没有思考过一个问题,为什么with 打开文件为何会自动关闭?

案例

手动实现操作文件的上下文管理器

class OpenFile(object):
    '''手动实现文件操作的上下文'''
    def __init__(self,filename,method):
        #初始化打开文件
        self.file = open(filename,method)

    def __enter__(self):
        #启动上下文时,将打开的对象返回出去
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        #退出上下文时,将文件关闭
        self.file.close()

with OpenFile('python.txt','w') as f:
    f.write('hello')
  

3、__call__方法

class Test(object):
	def __call__(self):
		print('触发了call方法')
  
t = Test()

t()

4、__str__方法

class Test(object):
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return '触发了str方法'

5、算术运算的实现

1557816513908.png

小案例验证

class Test(object):

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

    def __add__(self, other):
        print('对象之间使用了+号')
        return self.age+other.age

xiaoming = Test('小明',18)
laowang = Test('老王',48)

print(xiaoming+laowang)


__add__(self, other)	定义加法的行为+
__sub__(self, other)	定义减法的行为-
__mul__(self, other)	定义乘法的行为*
__truediv__(self, other)	定义真除法的行为/
__floordiv__(self, other)	定义整数除法的行为//
__mod__(self, other)	定义取余算法的行为%

关于python中的魔术方法就暂时给大家介绍到这里,更多的魔术方法,大家可以自行扩展学习:

更多的魔术方法参考地址:https://www.cnblogs.com/nmb-musen/p/10861536.html
1 操作
mslemonban 在 2021-01-27 19:26:59 更新了该帖
回帖
请输入回帖内容 ...