在Python 中有一些内置好的特定的方法,这些方法在进行特定的操作时会自动被调用,称之为魔法方法,其特征是左右有两个下划线。
1.基本的魔法方法
魔法方法 | 含义 |
---|---|
__new__(cls[, ...]) | 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法 3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用 4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string |
__init__(self[, ...]) | 构造器,当一个实例被创建的时候调用的初始化方法 |
__del__(self) | 析构器,当一个实例被销毁的时候调用的方法 |
__call__(self[, args...]) | 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b) |
__len__(self) | 定义当被 len() 调用时的行为 |
__repr__(self) | 定义当被 repr() 调用时的行为 |
__str__(self) | 定义当被 str() 调用时的行为 |
__bytes__(self) | 定义当被 bytes() 调用时的行为 |
__hash__(self) | 定义当被 len() 调用时的行为 |
__bool__(self) | 定义当被 len() 调用时的行为 |
__format__(self, format_spec) | 定义当被 format() 调用时的行为 |
(1) __ new__
很多人认为__init__是类的构造函数,其实不太确切,__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函数,创建并返回一个实例对象,如果__new__只调用了一次,就会得到一个对象。继承自object的新式类才有__new__这一魔法方法,__new__至少必须要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,__new__必须要有返回值,返回实例化出来的实例(很重要),这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例,若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行。__new__是唯一在实例创建之前执行的方法,一般用在定义元类时使用。
创建对象的步骤:
1、首先调用__new__得到一个对象
2、调用__init__为对象添加属性
3、将对象赋值给变量
实例1.不使用__new__返回当前类
class A(object):
pass
class B(A):
def __init__(self):
print('__init__被调用')
def __new__(cls):
print('__New__被调用')
print(id(cls))
return object.__new__(A)
b = B()
print(b)
print(type(b))
Output:
__New__被调用
2530157441880
<__main__.A object at 0x0000024D16AF6320>
<class '__main__.A'>
实例1.使用__new__返回当前类
class A(object):
pass
class B(A):
def __init__(self):
print('__init__被调用')
def __new__(cls):
print('__New__被调用')
print(id(cls))
return object.__new__(B)
b = B()
print(b)
print(type(b))
Output:
__New__被调用
2261354513416
__init__被调用
<__main__.B object at 0x0000020E826E63C8>
<class '__main__.B'>