元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板

四步走:

一:控制class定义类的过程

1.先拿到类名

2.在拿到基类

3.执行类体代码,得到名称空间的dict

4.调用元类将三个参数传递进去

#其实class 是上面四步的封装。(隔离了复杂度)

二:自定义元类

class Mymeta(type):

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

    super().__init__(class_name,class_base,class_dic)

class My(object,metaclass=Mymeta):

  pass

三:控制类与对象的产生

class Bar:

    def __call__(self, *args, **kwargs):        print(self)        print(args)        print(kwargs)

bar = Bar()bar('test')#对象后面加括号触发

class Mymeta(type):    def __init__(self, class_name, class_base, class_dic):        '''        :param class_name: 类名        :param class_base: 基类        :param class_dic: 名称空间        '''        if not class_name.istitle():            raise ValueError('类名需要大小写')

        if class_dic.get('__doc__'):            content = class_dic.get('__doc__')            content = content.replace(' ', '')            content = content.replace('\n', '')            if len(content)==0:                raise ValueError('类不能没有注释')    if '__doc__' not in class_dic or not clas_dic.get('__doc__').strip():        raise TypeError('必须为类指定文档注释')

        super(Mymeta, self).__new__(class_name, class_name, class_dic)

class Mysql:    '''    '''    def __init__(self, Host, Port):        self.Host = Host        self.Port = Port

#创建类的两种方式

方式一:、

  使用class关键字

class People(object):

  

  def talk(self):

    print('你好')

  def walk(self):

    print('走路')

方式二:

  手动模拟class创建类的过程:将创建类的步骤拆分来,手动去创建、

手动创建需要三个条件,

需要分别拿到

1.类名

2.类的父类

3.类体(执行后得到名称空间的dict)

class_name=People

class_base=object

class_body= '''  #类体

  def talk(self):

    print('你好')

  def walk(self):

    print('走路')

'''

cla=2wss_dic={}

步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体代码

(exec产生名称空间的过程与真正的class过程类似,只是后者会将_开头的属性变形,生成类的局部名称空间,即填充字典)

exec(class_body,globals,class_dic)

步骤二:

People=type(class_name,class_base,class_dic)

#实例化type得到对象Foo,即我们得到对象People,即我们用class定义的类People

一个没有显示的声明自己的元类,默认继承的就是type

  

88

python 面向对象编程 之 元类的更多相关文章

  1. python 面向对象进阶之元类metaclass

    一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...

  2. python高级编程之元类(第3部分结束)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(_ ...

  3. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...

  4. 【转】python面向对象中的元类

    type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...

  5. python 面向对象十二 元类

    一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...

  6. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  7. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  8. 初学Python——面向对象编程

    一.面向对象 or 面向过程? 编程范式: 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所 ...

  9. 神级程序员通过两句话带你完全掌握Python最难知识点——元类!

    千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生 ...

随机推荐

  1. GIS工具-shp浏览器

    GIS工具-shp浏览器 软件特点: 1. 单个文件,windows平台 2. 绿色,不用安装 3.C语言系列开发,非vb,.net,Java等,无需虚拟机,无需运行时,无需第三方工具 获取方法: 十 ...

  2. 关于池化(pooling)理解!!!

    网上看到一个池化的解释是: 为了描述大的图像,可以对不同位置的特征进行聚合统计,如计算平均值或者是最大值,即mean-pooling和max-pooling 我的想法是,图像做卷积以后,将图像信息(特 ...

  3. oracle 日志恢复数据

    1:首先查找redo,如果redo有可供恢复的信息,就那redo中的信息进行恢复,此时一般在恢复时,类似如下:SQL> recover database;Media recovery compl ...

  4. windows上使用metastore client java api链接hive metastore问题

    https://github.com/sdravida/hadoop2.6_Win_x64 下载winutils.exe 添加到path中

  5. ubuntu下zaibbix3.2报警搭建

    1.安装sudo apt install sendmail 2.测试发送邮件: echo "正文!" | mail -s 标题 XXX@qq.com 3.成功后继续安装邮件服务器. ...

  6. 04_web基础(二)之web构建

    03.04.05.06web项目创建 07.第一个Servlet程序 1.拷贝tomcat 中的 servlet-api.jar 在lib包下面 2.新建一个HelloWordServlet类并实现 ...

  7. 使用in ()进行批量删除

    public bool DeleteList(string idlist ) { StringBuilder strSql=new StringBuilder(); strSql.Append(&qu ...

  8. asp.net 修改AD账号信息

    public void ADInfoEdit(ADUser adu) { try { DirectoryEntry dADM; DirectoryEntry objectuser = null; dA ...

  9. python随笔 join 字典,列表的清空 set集合 以及深浅拷贝(重点..难点)

    一,字符串和列表的转换 1.str中的 join 方法: 把列表转换成字符串 # 将列表转换成字符串. 每个元素之间用_连接 s = '**'.join(['李启政',' 郑强' , '孙福来']) ...

  10. centos 7.2 安装域名服务器(bind9.9 集群--主从架构),私有域名服务器+缓存

    1.安装组件 yum install bind bind-utils -y 2.启动域名服务 service named start chkconfig named on ss -unlt |grep ...