13组代码告诉你,如何用Python常用魔术方法阅读源码

2606 篇文章 34 订阅
2122 篇文章 14 订阅

前言:

在看 python 源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由 python 解释器提供的具有特殊意义的方法,主要是 python 源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下划线方法,更有益于我们阅读源码。今天我们就来看看常用的双下划线方法到底是干什么的。

_init()

1、代码演示
class Demo:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("姓名:",self.name)
        print("年龄:",self.age)

if __name__ == '__main__':
    cl = Demo("狗子", 22)
输出:
姓名:狗子
年龄:22
2、总结
   1、触发方式,类实例化的时候自动调用。
   2、作用,用于创建实例属性。

new()

1、代码演示
class Demo:
    def __init__(self):
        print("如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行")
        print("如果不在__new__方法里面调return创建好的对象,__init__不会被执行")
    def __new__(cls, *args, **kwargs):
        print("__new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法")
        return super().__new__(cls,*args,**kwargs)
if __name__ == '__main__':
    cl = Demo()
输出:
__new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法
如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行
如果不在__new__方法里面调return创建好的对象,__init__不会被执行
2、总结
   1、触发方式,实例化类的时候自动调用。
   2、作用,创建类实例。
   2、__new__()方法执行顺序在__init()之前。
   3、如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行。
   4、如果不在__new__方法里面调return创建好的对象,__init__不会被执行。

call_()

1、代码演示
class Demo:
    def __init__(self):
        print("初始化方法在类实例化的时候执行")
    def __call__(self):
        print("将类实例当做函数调用的时候触发__call__方法")
if __name__ == '__main__':
    cl = Demo()
    cl()
输出:
初始化方法在类实例化的时候执行
将类实例当做函数调用的时候触发__call__方法
2、总结
   1、触发方式,将类实例像调函数一样调用的时候自动调用。
   2、作用,让类实例可以像调函数一样调用。
   3、构造方法__new__的执行是由创建对象触发的,即:对象 = 类名()4、对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

len(

1、代码演示
class Demo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __len__(self):
        return len(self.__dict__)

if __name__ == '__main__':
    cl = Demo("狗子", 22)
    print(len(cl))
输出:2
2、总结
   1、触发方式,调用len()函数的时候自动化调用。
   2、作用,计算对象的长度。

del()

1、代码演示

class Demo:
    def __del__(self):
        print("你别过来,我怕猪......")
if __name__ == '__main__':
    cl = Demo()
2、总结
   1、触发方式,对象在内存中被释放时,自动触发执行。
   2、此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的。

str()

1、代码演示
class Demo:
    def __init__(self):
        pass
    def __str__(self):
        print("操作类实例的时候自动化调用__str__")
        return "seccess"
if __name__ == '__main__':
    cl = Demo()
    print(cl)
输出:
操作类实例的时候自动化调用__str__
seccess
2、总结
   1、触发方式,操作类实例的时候自动调用。
   2、作用,用于操作类实例的时候返回指定的数据。

repr()

1、代码演示
class Demo:
    def __repr__(self):
        return "与__str__功能一样"
if __name__ == '__main__':
    cl = Demo()
    print(cl)
输出:
与__str__功能一样
2、代码演示
class Demo:
    def __str__(self):
        return "当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__"
    def __repr__(self):
        return "与__str__功能类似"
if __name__ == '__main__':
    cl = Demo()
    print(cl)
输出:
当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__
3、总结
   1、触发方式,操作类实例的时候自动调用。
   2、作用,与__str__()类似
   3、当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__。

eq()

1、代码演示
class Demo:
    def __init__(self):
        self.num1 = 10
        self.num2 = 20
    def __eq__(self,obj):
        print(self.num1)
        print(obj.num2)
        return self.num1 == obj.num2
if __name__ == '__main__':
    clA = Demo()
    clB = Demo()
    print(clA == clB )
输出:
10
20
False
2、总结
   1、触发方式,调用相等判断的时候自动调用。
   2、作用,用于数据相等判断

hash()

1、代码演示
class Demo:
    def __init__(self,name,age):
        self.name = str(name)
        self.age = str(age)
    def __hash__(self):
        return hash(self.name+self.age)
if __name__ == '__main__':
    cl = Demo("狗子",20)
    print(hash(cl))
输出:
1935947926878097268
2、总结
   1、触发方式,调用hash()方法时自动调用
   2、作用,计算哈希值
   3、只有不可变数据类型才有哈希值。

getitem()

1、代码演示
class Demo:
    def __init__(self,name):
        self.name=name
    def __getitem__(self, item):
        print("执行obj[key]获取实例属性的时候触发__getitem__方法")
        return self.__dict__[item]

if __name__ == '__main__':
    cl = Demo("狗子")
    print(cl["name"])
输出:
执行obj[key]获取实例属性的时候触发__getitem__方法
狗子
2、总结
   1、触发方式,执行obj[key]获取实例属性的时候自动调用。
   2、作用,用于返回属性值。

setitem()

1、代码演示
class Demo:
    def __init__(self,name):
        self.name=name
    def __setitem__(self, key, value):
        print("执行obj[key]=value的时候触发__setitem__方法")
        self.__dict__[key]=value
if __name__ == '__main__':
    cl = Demo("狗子")
    cl["age"] = 20
    print(cl.__dict__)
输出:
执行obj[key]=value的时候触发__setitem__方法
{'name': '狗子', 'age': 20}
2、总结
   1、触发方式,执行obj[key]=value的时候自动调用。
   2、作用,用于设置对象属性。

delitem()

1、代码演示
class Demo:
    def __init__(self,name):
        self.name=name
    def __setitem__(self, key, value):
        print("执行obj[key]=value的时候触发__setitem__方法")
        self.__dict__[key]=value\

    def __delitem__(self, key):
        print('执行 del obj[key]时触发__delitem__')
        self.__dict__.pop(key)
if __name__ == '__main__':
    cl = Demo("狗子")
    cl["age"] = 20
    print(cl.__dict__)
    del cl["age"]
    print(cl.__dict__)
输出:
执行obj[key]=value的时候触发__setitem__方法
{'name': '狗子', 'age': 20}
执行 del obj[key]时触发__delitem__
{'name': '狗子'}
2、总结
   1、触发方式,执行del obj[key]时自动调用。
   2、作用,用于删除对象属性。

delitem()

1、代码演示
class Demo:
    def __init__(self,name):
        self.name=name
    def __setitem__(self, key, value):
        print("执行obj[key]=value的时候触发__setitem__方法")
        self.__dict__[key]=value
    def __delattr__(self, item):
        print('执行 del obj.key时候执行__delattr__')
        self.__dict__.pop(item)
if __name__ == '__main__':
    cl = Demo("狗子")
    cl["age"] = 20
    print(cl.__dict__)
    del cl.age
    print(cl.__dict__)
2、总结
   1、触发方式,执行del obj.key时候自动调用
   2、作用,用于删除对象属性。

资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值