互联网的数据爆炸式的增长,而利用 Python 爬虫我们可以获取大量有价值的数据

类也是对象

在理解元类前,需要先掌握Python中的类。在大多数编程语言中,类就是一组描述如何生成对象的代码段。在Python中这一点仍然成立:

但是,Python中的类远不止如此。类也是一种对象(实例)。是的,没错,就是对象。只要使用关键字class,Python解释器在执行时就会创建一个类对象。

上述代码在内存中创建一个名为ObjectCreator的类对象。只不过这个对象(类)拥有创建对象(类实例)的能力,而这也是它是一个类的原因。但是,ObjectCreator本质上仍然是一个对象,可以对它做如下的操作:

动态创建类

因为类也是对象,所以可以在运行时动态的创建它们,就像其他对象一样。可以在函数中创建类,使用class关键字即可。

由于类也是对象,所以它们也是通过什么东西来生成的。还记得内建函数type吗?这个古老但强大的函数能够让你知道一个对象的类型是什么,就像这样:

type还有一种完全不同的能力,它也能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类。(根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在Python中是为了保持向后兼容性.)

type可以像这样工作

如下面的代码

等价于

type 接受一个字典来为类定义类属性,因此

可以翻译为

并且可以将Foo当成一个普通的类一样使用

当然,也可以继承这个类,如下代码

也可以写成

也可以为类增加方法

在Python中,类也是对象,可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,这些是通过元类实现的。

什么是元类

元类就是用来创建类的“东西”。创建类是为了创建类的实例对象。但是我们已经知道了Python中的类也是对象。元类就是用来创建这些类(对象)的,元类就是类的类,简而言之,元类是用来创建和管理类对象的。可以这样理解:

ype可以让你这样创建一个类

**这是因为type是一个元类。**type就是Python在背后用来创建所有类的元类。

type就是创建类对象的类。可以通过__class__属性来看到这一点。Python中所有的东西,注意,是指所有的东西—都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来的。

那么对于任何一个__class__的__class__属性又是什么呢?

因此,元类就是用来创建类对象的。如果你喜欢的话,可以把元类称为“类工厂”(不要和工厂类搞混了)。 type就是Python的内建元类,当然,你也可以自定义元类。

__metaclass__属性

可以在定义类的时候为其添加__metaclass__属性。

如果你这么做了,Python就会用指定的元类来创建类。

小心点,这里面有些技巧。首先写下class Foo(object),但是类对象Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类。

当你写如下代码时 :

Python做了如下的操作:

自定义元类

元类是用来创建和管理类对象的。

__metaclass__不一定是个类,函数也可以- -! 这里先以一个简单的函数作为例子开始。

这一次用一个真正的class来做元类。

请记住,’type’实际上是一个类,就像’str’和’int’一样,可以从type继承。

自定义元类时,通常会继承type,并重新实现__init__()或__new__()等方法。

在这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__ ,如果需要的话,也可以在__init__中做些事情。

你可能已经注意到了有个额外的参数upperattr_metaclass,这并没有什么特别的。类方法的第一个参数总是表示当前的实例,就像在普通的类方法中的self参数一样。当然了,为了清晰起见,这里的名字起的比较长。就像self一样,所有的参数都有它们的传统名称。因此,一个元类应该是这样的:

如果使用super方法的话,还可以使它变得更清晰一些。

再来个例子,定义一个元类,用来检查类对象中的方法是否定义了__doc__

未定义__doc__

定义了__doc__

除此之外,关于元类没有别的可说的了。使用到元类的代码比较复杂,这背后的原因倒并不是因为元类本身,而是因为通常会使用元类去做一些晦涩的事,依赖于自省,控制继承等等。确实,用元类来搞些“黑魔法”是特别有用的,但是搞出的东西都很复杂。就元类本身而言,它们其实是很简单的:

1) 拦截类的创建;

2) 修改和检查类;

3) 返回修改之后的类;

究竟为什么要使用元类?

现在回到我们的大主题,为什么要去使用这种容易出错且难懂的特性?好吧,一般来说,你根本就用不上它。

“元类就是黑魔法,99%的用户根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。“ —— Python界的领袖 Tim Peters

元类的主要用途是创建API。一个典型的例子是Django ORM。它允许像这样定义:

但是如果像这样做的话:

这并不会返回一个IntegerField对象,而是会返回一个int,甚至可以直接从数据库中取出数据。这是有可能的,因为models.Model定义了__metaclass__, 并且使用了一些魔法能够将你刚刚定义的简单的Person类转变成对数据库的一个复杂hook。Django框架将这些看起来很复杂的东西通过暴露出一个简单的使用元类的API将其化简,通过这个API重新创建代码,在背后完成真正的工作。

结语

首先,你知道了类是能够创建出类实例的对象。好吧,事实上,类本身也是实例,当然,它们是元类的实例。

用来表示python代码块的是什么_三分钟带你用简单的Python代码深入理解Python中的元类...相关推荐

  1. python 自动补全函数括号_三分钟,让你弄清楚Python中函数的括号使用

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! 一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大困惑. ...

  2. python 最小二乘法三维坐标拟合平面_【MQ笔记】超简单的最小二乘法拟合平面(Python)...

    这篇笔记中,我主要通过解决"由离散点拟合平面"这个小问题,学习了超定方程最小二乘解的求解方法.在这里我整理了两种求解思路用以交流. 直接求解超定方程. 我们知道,对于一个平面,其方 ...

  3. 蒙太奇图片代码+说明(*小白专用,三分钟内完成*)

    蒙太奇图片代码+说明(小白专用,三分钟内完成) ** 本文提供的代码转自https://blog.csdn.net/weixin_44857688/article/details/107772751 ...

  4. java 代码块 作用_Java核心(三):代码块的作用

    Java中用{ }括起来的代码段就是代码块,他分为如下几种类型 位置 作用 局部代码块 在方法当中使用,作用是控制变量的生命周期. 局部代码块的变量,只能在代码块内部使用,在执行结束后会被Java回收 ...

  5. python 匹配整数或者小数(包括正数和负数)(简单易懂,代码可以直接运行)

    python 匹配整数或者小数(包括正数和负数)(简单易懂,代码可以直接运行) *这个实验算是五个正则表达式里面最难的的哪一个了,?是正则表达式里面贪婪与非贪婪的概念,有?则-?可有可无,刚好可以用于 ...

  6. Python中的元类是什么?

    元类是什么,我们将它们用于什么? #1楼 请注意,此答案适用于2008年编写的Python 2.x,元类在3.x中略有不同. 元类是使"类"工作的秘诀. 新样式对象的默认元类称为& ...

  7. vs代码补全的快捷键_效率工具 | 一款基于深度学习的代码自动补全神器

    前言 代码补全对于大多数开发人员来说是至关重要的,它可以有效的提高开发效率.减少拼写错误和输入代码量.我们使用的大多数开发工具都自带补全功能,或者可以通过安装插件具备补全功能.但是,以往的代码补全功能 ...

  8. [转]深刻理解Python中的元类(metaclass)

    类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...

  9. python元类的概念_Python中的元类编程 | 学步园

    过去有这样的概念,一直没有深究它的意义.今天同事问到,刚好也好好了解下. #===============================================Python中的元类编程=== ...

最新文章

  1. 操作系统:几种页面置换算法
  2. 2019牛客暑期多校训练营(第一场)E题 ABBA(DP)
  3. 即时通讯的企业应用和个人应用的区别
  4. 基于策略模式的商场价格优惠设计
  5. C语言调用函数将is替换为be,C语言程序设计课件ppt.ppt
  6. 麒麟810怎么样_麒麟810+6G+128G+大电池,千元价格的手机上手体验
  7. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  8. Eigen学习笔记1
  9. 为 Electron / Atom Shell 设置应用icon(应用图标)
  10. 浅谈iOS开发中的锁
  11. #微积分#正项级数收敛性判别方法
  12. Java - 从零学起(二)
  13. Snort Rules——使用pcre进行规则匹配
  14. copyonwritearraylist 深究
  15. android 名片识别软件,手机名片识别工具Android名片全能王评测
  16. 搭档之家:李佳琦“双11”直播最低价,还是贵了?
  17. Linux 中有效用户组和初始用户组
  18. Android 如何实现手机震动
  19. 设计模式(10)——策略模式
  20. ORA-00600: internal error code 内部错误代码

热门文章

  1. linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密
  2. linux c之使用共享内存实现进程间通信
  3. numpy拼接_巧用numpy切分图片
  4. android studio adil位置,在Android Studio 中正确使用adil ”绝对经典“
  5. java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法
  6. 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
  7. mysql分组查询和子查询语句_6.MySQL分组聚合查询,子查询
  8. 国外的幼儿数学竟然这样出题?来测测你的孩子都会做吗?
  9. “甜橙金融杯”数据建模大赛发布,8万重金寻找大数据金融人才!
  10. mysql添加字段时定义候选键_MySQL 表约束