yamx

定制元类来控制类的产生之__new__

# 调用元类产生类会发生的三件事:(与调用类产生对象的步骤一致)
# 1、先生成一个空对象(调用__new__方法生成的对象

# 2、调用元类下的__init__方法,完成初始化对象的操作

# 3、返回一个初始化好的对象

    __new__方法是在__init__之前就被调用的,__new__方法默认是生成带有当前类的基本属性的对象:

    def __new__(cls, *args, **kwargs):
            return type.__new__(cls, *args, **kwargs)

    只有通过__new__方法生成了对象后,才会进一步调用__init__方法。因为__init__方法需要以self参数(也就是一个对象)。


验证如下:

class Mymeta(type):

    def __init__(self, class_name, class_bases, class_dic):

        print("init方法")


    def __new__(cls, *args, **kwargs):

        print("new方法")

        print(cls)
        print(args)
        print(kwargs)


class Test(metaclass=Mymeta):

    pass


# 输出结果:

# new方法

# <class '__main__.Mymeta'>

# ('Test', (), {'__module__': '__main__', '__qualname__': 'Test'})

# {}

    因为__new__方法并没有返回一个对象,所以无法继续调用__init__方法,也就无法通过该类(元类)产生一个对象(类),此时通过Test实例化会报错  :   TypeError: 'NoneType' object is not callable


将__new__方法改写:

def __new__(cls, *args, **kwargs):

        print("new方法")

        return type.__new__(cls, *args, **kwargs)


# 此时输出:

# new方法

# init方法


评论

© yamx | Powered by LOFTER