首先元类中的__new__被调用

所有使用该元类的类都会调用一次,不管其有没有初始化,所以元类__new__的作用是修改/验证类的定义

返回的是一个元类的实例,即一个类的定义

元类的__init__由其__new__调用

接着元类的__call__被调用,要返回一个类的实例

元类__call__中要调用类的__new__和__init__

def __call__(cls, *args, **kwargs):
print("calling Meta's __call__", cls)
i = cls.__new__(cls)
i.__init__(*args, **kwargs)
return i

当然,也可以处理完逻辑之后, return super().__call__(*args, **kwargs)

--------------------------------------------------------------------------------------------------

__new__ 是类方法

__init__ 和 __call__ 是实例方法,只能由类的实例(对象)来调用

因此在类实例化过程中 a = A(), 类是可调用的函数,调用的是元类中的__call__函数, 因为类是元类的实例

python 中类的初始化过程的更多相关文章

  1. 【软件构造】-<笔记>-浅谈java中类的初始化过程

    编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...

  2. Java 中类的初始化过程

    先来一张 JVM 中的内存模型 . 在Java 虚拟机原理这本书中介绍了类会被初始化的 5 种情况 . 1 遇到 new getstatic putstatic 和 invokestatic 这 4 ...

  3. python中类的初始化案例

    1 class Chinese: 2 # 初始化方法的创建,init两边双下划线. 3 def __init__(self, hometown): 4 self.hometown = hometown ...

  4. java中类的创建及初始化过程

    java中类的创建及初始化过程无外乎两种情况,其一为单类的创建及初始化,其二具有继承关系的父子类创建及初始化过程.     首先说简单的,单类的创建及初始化过程.在java中我们都知道绝大部分对象的创 ...

  5. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

  6. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

  7. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  8. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  9. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

随机推荐

  1. oracle-分区(笔记)

    partition by 用于指定分区方式 range 表示分区的方式是范围划分 partition pn 用于指定分区的名字 values less than 指定分区的上界(上限) ------- ...

  2. ambassador kubernetes native api gateway

    github 上的介绍: Ambassador is an open source Kubernetes-native API Gateway built on Envoy, designed for ...

  3. CRC 自动判断大端 小端

    /* aos_crc64.c -- compute CRC-64 * Copyright (C) 2013 Mark Adler * Version 1.4 16 Dec 2013 Mark Adle ...

  4. "==" 与 “equals”

    “==”: “==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象.(操作符不支持重载overloading) “==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指 ...

  5. xss 攻击 sql 注入

    XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...

  6. mysql 下字符集知识汇总

    Do not issue the query set names with Connector/J, as the driver will not detect that the character ...

  7. 设置VS以管理员身份运行

    以vs2013为例 vs右键属性 ----- ​ 找到目标位置如下 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\ ...

  8. Windows7下搭建Python2.7环境

    机器: Windows7_x86_64 步骤: 1.下载Python2.7 下载地址:https://www.python.org/downloads/ 2.安装Python2.7 双击安装包,安装过 ...

  9. C++ 栈 (数组实现)

    上一篇用链表实现了stack,这篇我们采用数组来存储数据,数组更容易理解,直接贴代码 第一.代码实现 #pragma once #include <iostream> using name ...

  10. PKU1988磁铁

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 16258   Accepted: 5579 Ca ...