一文读懂什么是Python魔法函数

一文读懂什么是Python魔法函数

Python的魔法函数是指Python的类中,一系列函数名由双下划线包裹的函数。

笔者最初接触到魔法函数的使用是在Pytorch中,在Pytorch中的Dataset类中有这样的用法:

image-20210904114042487

除了常见的__init__构造函数外,还有__getitem__和__len__函数。在之后的代码中,笔者并没有看到__getitem__和__len__函数的显示调用。那么这样的声明与定义有什么意义?

首先定义一个空类,并用dir方法获取类中的所有方法(一个空类真的是空空如也吗?)

class Foo:
    pass

print(dir(Foo))

结果:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

我们可以看到许多默认的方法。比如每一个类都有一个默认的__init__方法作为其构造函数。而如果想定义自己的构造函数,就需要显式地对构造函数进行定义。

下面结合实例来说明一些魔法函数的用处。

基本

__new__(cls[,args…])

一个对象实例化的时候所调用的第一个方法。

__init__(self[, args…])

默认的构造函数,用于类的初始化。

注:__init__和__new__的区别:

在一般情况下,我们在构造类时调用的是__init__,但实际上第一个被调用的方法是__new__。以下代码为证:

class Bar:
 def __new__(cls, num):
     print("use __new__ method")
     return super(Bar, cls).__new__(cls)

 def __init__(self, num):
     print("use __init__ method")
     self.num = num
bar = Bar(1)


结果为:

use __new__ method
use __init__ method

一般情况下,我们放心使用__init__方法进行对象的构造即可,只需大致理解__new__和__init__的区别即可:

__new__:创建对象时调用,会返回当前对象的一个实例

__init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值

__str__(self)

定义使用print()时的行为。

__repr__(self)

与str方法类似,但更面向开发者。如果一个类同时定义str()和repr(),那么会优先使用str()。

注:str和repr的返回值必须为str

__call__(self[, args…])

像函数一样调用类的实例。可以接参数。

__get__(self)

定义用对象为其他成员赋值的行为。

__set__(self[,args…])

定义为其他数据类型为对象赋值时的行为。

__del__(self)

默认的析构函数。

代码实例:

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值