Python 中常见的魔法方法

什么是Python魔法方法

    魔法方法是在Python的类中被双下划线前后包围的方法,如常见的 :initnew、__del__等。这些方法在类或对象进行特定的操作时会自动被调用,我们可以使用或重写这些魔法方法,给自定义的类添加各种特殊的功能来满足自己的需求。

常用的魔法方法

init

    最为常见并熟知的魔法方法就是__init__()方法,可以用此方法来定义一个对象的初始化操作。例如:

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b
复制代码
new

    init()方法很容易被认为是在实例化对象时调用的第一个方法,其实不是,当我们实例化一个对象的时候,例如class1=MyClass(1, 2),第一个被调用的是__new__()方法,而后再调用__init__()方法,并把一些参数传给__init__()方法,new()方法才是真正地创建了实例化对象,init()方法只是给这个对象进行了初始化操作。

class MyClass:
    def __init__(self, a, b):
        print("__init__()方法被调用")
        self.a = a
        self.b = b

    def __new__(cls, *args, **kwargs):
        print("__new__()方法被调用")
        print("args:", args)
        c = super().__new__(cls)
        return c


class1 = MyClass(1, 2)
复制代码

执行结果如下:      在这里插入图片描述

    需要注意的是: new()方法第一个参数必须是cls参数,表示当前类,必须返回一个实例化对象,没有什么特别的需求,最好不用重写此方法。

del

    当一个对象的生命周期结束被彻底销毁的时候被调,__del__方法会被调用,不常用,一般不需要进行重写。

str & repr

    str()方法定义当被print()方法或者str()方法调用时的行为,repr()方法定义当被print()方法或者repr()方法调用时的行为,一般来说,它们的功能都是实现类到字符串的转化,实现方式上也没有特别的差异。 但实际上,str()方法的返回结果可读性应该要更强一些,repr()方法的返回结果要更加准确,也就是说,str()方法的意义是得到便于人们阅读的信息,而__repr__()方法的目的在于开发者便于调试。

class MyClass:
    def __str__(self):
        return "MyClass类的实例"

    def __repr__(self):
        return self.__class__.__name__


class1 = MyClass()
print(str(class1))
print(repr(class1))
print(class1)
复制代码

    注意:当进行print()的时候,首先被执行的是__str__()方法,如果没定义__str__()方法,repr()方法才会被执行。

call

call()方法可以让类的实例像函数一样被调用。例如:

class Multiply:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self, *args, **kwargs):
        return self.x * self.y

p = Multiply(2, 3)
print(p())
复制代码

    当调用p()时,call()方法会被调用,返回参数x和y的乘积,call()方法也可以接受参数。

iter

    如果我们希望一个实例化对象是一个迭代器,可被用于for…in循环遍历,这时我们需要在类中定义__iter__()方法和__next__()方法,iter()方法返回一个迭代对象,next()返回迭代器的下一个元素,这个在之前的文章有说过:迭代器Iterator的实现,这里就不展开了。

总结

    其实魔法方法远远不止这些,还有很多很多也值得我们去使用,Python中的魔法方法就跟它的名字一样有魔法,总是可以便捷的给你提供你所需要的各种需求,它们是Python面向对象编程的一大利器,使用好了会有意想不到的结果,慢慢去了解并使用它们吧。
在这里插入图片描述

    如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到806549072,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值