一文读懂什么是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)
默认的析构函数。
代码实例: