一文读懂什么是Python魔法函数 |
您所在的位置:网站首页 › 魔法指的是什么 › 一文读懂什么是Python魔法函数 |
一文读懂什么是Python魔法函数
Python的魔法函数是指Python的类中,一系列函数名由双下划线包裹的函数。 笔者最初接触到魔法函数的使用是在Pytorch中,在Pytorch中的Dataset类中有这样的用法: 除了常见的__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 |