一篇文章告诉你什么是Python元类

发表于:2018-1-29 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:刘志军    来源:稀土掘金

  龟叔发明了Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。
  这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念,它是 Python世界中的造物主,虽然我们很少去直接使用它,但天天都在用,它就是今天的主角------元类。
  今天我的任务就是彻底明白什么是元类,看懂了别忘了给我点个赞,分享给更多人。
  要搞懂元类,我们还是先从对象说起。
  对象(Object)
  Python一切皆对象,这句话你一定有听说过(现在你就听说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:
  >>>i=10
  >>>s="abc"
  >>>nums=[1,2,3]
  >>>dicts={"name":"zhang"}
  等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。
  标识
  标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数id()可以查看对象的ID标识。
  >>>id(i)
  40592592
  >>>id(s)
  44980584
  对象值
  对象的第二个属性是值,值很好理解,比如i的值是10,s的值是abc,nums的值就是1,2,3。
  类型
  对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的,比如上面的i的类型是int类型,这个对象就是由int构造出来的。s类型是字符串类型,nums的类型是列表类型,dicts的类型是字典类型,它们都是由对应的类型构建出来的。
  通过 type()可以查看对象的类型。
  >>>type(i)
  <class'int'>
  >>>type(s)
  <class'str'>
  >>>type(nums)
  <class'list'>
  >>>type(dicts)
  <class'dict'>
  对象的类型也和ID标识一样,确定好之后就不会再变化了。
  类与(实例)对象
  除了系统已经定义好了的整数类型,字符串类型,列表等类型之外,我们还可以创建自己的类型,用关键字class来定义。例如:
  >>>classPerson:
  #这里的self指某个实例对象自己
  ...def__init__(self,name):
  #name是实例的属性
  ...self.name=name
  #live是类的属性
  live=True
  这里的 Person就是自定义类,类是一个抽象的模版,既不指张三也不是李四,现在我们可以通过调用这个类来构造(实例化)出一个具体的,实在的,有名字的对象出来,这个对象称之为实例对象。
  >>>p1=Person("zhangsan")
  >>>p1.name
  'zhangsan'
  >>>
  >>>p2=Person("lisi")
  >>>p2.name
  'lisi'
  这里的 p1、p2就是实例化之后的(实例)对象,这两个对象的类型都是Person类,类与(实例)对象的关系就像一个车辆模具与一辆被造出来的真实车的关系一样。
  >>>p1
  <__main__.Personobjectat0x0195AA30>
  >>>type(p1)
  <class'__main__.Person'>#这里的__main__是模块名称
  类也是对象(又叫类对象)
  刚刚我们说了一切都是对象,实例(真实车)是对象,类(模具)当然也是对象,因为它也是个实实在在存在的东西,
  当 Python解释器执行到关键字class这个指令的时候,在内部就会创建一个名为"Person"的类,这个类也是个对象,我们称之为类对象(注意区别实例对象),它一样有ID标识、有类型、有值。例如:
  >>>id(Person)
  26564024
  >>>type(Person)
  <class'type'>
  >>>Person
  <class'__main__.Person'>
  我们注意到这个?Person?这个类对象的类型叫“type”,也就是说Person类是由type创建出来的,现在你要记住,p1,p2是实例对象,而Person是类对象。另外,这个type是什么鬼?
  我们来回顾一下,实例对象 p1的类型是类对象Person,Person的类型type
  >>>nums=[1,2,3]
  >>>type(nums)
  <class'list'>
  >>>type(list)
  <class'type'>
  nums的类型是list,list的类型也是type,字典类(dict)的类型也是type,所有类的类型都是type,也就是说所有的类都是由type创建的。这个type就是元类,道生一,一生二,三生万物,元类就是Python中的造物主。(元类自己也是对象)
  现在我们都知道类(对象)可以使用class关键字创建,我们还知道类(对象)的类型是type,既然知道了它的类型是?type,那么肯定可以通过type(元类)来创建。
  用元类创建类
  前面讲到过,type有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。
  >>>Person=type("Person",(),{"live":True})
  >>>Person
  <class'__main__.Person'>
  Person就是一个类,它等价于:
  >>>classPerson:
  ...live=True
  ...
  >>>Person
  <class'__main__.Person'>
  用元类 type创建类的语法是:
  type(类名,基类元组(可以为空),属性字典)
  那么元类到底有什么用处呢?我们真的需要元类吗?请关注下回讲解,(留给大家多些时间消化,O(∩_∩)O)

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号