前言
用双下划线包围的特殊方法在python中被称为魔法方法,这里介绍python中的__init __和 __new __两个魔法方法。注: __new __方法在__init __之前执行。
一、 __new __
该方法主要是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
class A:
def __new__(cls):
return "abc"
class B:
pass
print(A())#abc
print(B())#<__main__.B object at 0x00000175E1E7DE48>
__new __方法在类定义中不是必须写的,如果没定义,默认会调用object. __new __去创建一个对象。如果定义了,就是override,可以custom创建对象的行为。
同时应该注意必须要有返回值,返回实例化出来的实例;在自己实现__new __()时需要注意:可以return父类(通过super(当前类名,cls)).__new __出来的实例
二、__init __
该方法是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
class A:
def __init__(self,name):
self.name=name
a=A("agamgn")
print(a.name)#agamgn
这样便是__init __最普通的用法了。同时需要注意:
1、有一个参数self,该self参数就是new()返回的实例;
2、__init __()在__new __()的基础上完成初始化动作,不需要返回值;
3.若__new __()没有正确返回当前类cls的实例,那__init __()将不会被调用
4.创建的每个实例都有自己的属性,方便类中的实例方法调用;
关于第三点:若__new __()没有正确返回当前的cls的实例,则__init __()不会被调用
class B:
def __new__(cls):
print("__new__方法被执行")
def __init__(self):
print("__init__方法被执行")
b=B()#__new __方法被执行
正确方式:
class C:
def __new__(cls):
print("__new__方法被执行")
return super(C,cls).__new__(cls)
def __init__(self):
print("__init__方法被执行")
c=C()
网友评论