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

您所在的位置:网站首页 魔法指的是什么 一文读懂什么是Python魔法函数

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

2024-07-11 17:12| 来源: 网络整理| 查看: 265

一文读懂什么是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)

默认的析构函数。

代码实例:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3