元类是类的类,使我们自定义的类,即我们用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. C++ MFC 改变控件大小和位置

    用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置. void MoveWindow(int x,int y,int nWidth,int nHeight ...

  2. eclipse git 忽略文件

    ps:git中只有.gitignore文件需要先加索引再提交,其它的都可以直接提交

  3. 学习JS的心路历程-声明

    变量 在程序中将一个值指定(assign)给一个符号式的容器(symbolic container),叫做一个变量(variable). 声明在JS中目前提供了三种声明方式: var 声明一个变量,可 ...

  4. soap 简单调用其他系统的函数

    <?xml version ='1.0' encoding ='UTF-8' ?> <definitions name='自定义名称' targetNamespace='目标命名空间 ...

  5. php正则替换双引号里面的字符

  6. 05_ssm基础(六)之SpringMVC

    36.springMVC之入门 1.springMVC简介 Spring MVC是基于MVC模式的一个Web框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化.等等),而且使用简 ...

  7. 2.7、CDH 搭建Hadoop在安装(使用向导设置群集)

    步骤7:使用向导设置群集 完成“ 群集安装”向导后,“ 群集设置”向导将自动启动.以下部分将指导您完成向导的每个页面: 选择服务 分配角色 设置数据库 查看更改 首次运行命令 恭喜! 选择服务 “ 选 ...

  8. 1.5.6、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用Cloudera Manager模板创建CDH群集)

    使用Cloudera Manager模板创建CDH群集 您可以通过从Cloudera Manager管理的现有CDH群集导出群集模板来创建新的CDH群集.然后,您可以修改模板并使用它在新的主机集上创建 ...

  9. msf客户端渗透(二):PDF漏洞、恶意网站、flash漏洞、IE漏洞、java漏洞、android漏洞、VBScript感染payload

    这个漏洞利用只在XP上有效 利用pdf漏洞利用payload exploit生成一个pdf文件 传到被攻击机上 启动msf侦听 exploit -j XP上双击运行这个pdf时,kali获取到一个sh ...

  10. metasploit framework(五):meterpreter基本命令和python扩展

    基于内存的DLL注入式payload 注入合法的系统进程并建立stager 基于stager上传和预加载DLL进行扩展模块的注入(客户端API) 基于stager建立的socket连接建立加密的TLS ...