Python中的对象、类、元类

标签: Python 对象
31人阅读 评论(0) 收藏 举报
分类:
龟叔发明了Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。
这些概念对初学者似乎没一个好懂的,不过还有比这更难的概念,它是Python世界中的造物主,虽然我们很少去直接使用它,但天天都在用,它就是今天的主角--元类。
要搞懂元类,我们还是先从对象说起。

对象(Object)

Python中一切皆对象,这句话你一定有听说过(现在你就听说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:
i=10
s='abc'
nums=[1,2,3]
dicts={"name":"zeng"}
等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。
标识
标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数 id()可以查看对象的ID标识。
print("对象的唯一标识为:"+str(id(i)))
对象的唯一标识为:1704834400
print("对象的唯一标识为:"+str(id(dicts)))
对象的唯一标识为:1918903679592
对象值
对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。
类型
对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的。
比如上面i的类型是int类型,s的类型是字符串类型,nums的类型是列表类型,dicts的类型是字典类型,它们都是由对应的类型构建出来的。
通过type()可以查看对象的类型。
print("对象的类型为:"+str(type(i)))
print("对象的类型为:"+str(type(dicts)))
对象的类型为:<class 'int'>
对象的类型为:<class 'dict'>

对象的类型也和ID标识一样不会改变。唯一可能变的就是值。

除了系统已经定义好了的整数类型,字符串类型,列表等类型之外,我们还可以创建自己的类型,用关键字class来定义。例如:

class Person(object):
    #__init__()有点像构造函数,实例化类时调用
    def __init__(self,name,gender):
    #name是实例的属性
        self.name = name
        self.gender = gender
    #live是类的属性
    live = True

这里的 Person 就是自定义类,类是一个抽象的模版,既不是指张三也不是李四等具体的人,现在我们可以通过调用这个类来构造(实例化)出一个具体的,实在的,有名字的对象出来,这个对象称之为实例对象(Instance)。

类与(实例)对象

p1 = Person ("zhangan","")
print(p1.name)
p2 = Person ("lisi","")
print(p2.name)
zhangan
lisi

这里的 p1、p2 就是实例化之后的(实例instance)对象,这两个对象的类型都是 Person 类,类与(实例)对象的关系就像一个车辆模具与一辆被造出来的真实车的关系一样。如下所示:

print(p1)
print(id(p1))
print(type(p1))
<__main__.Person object at 0x000002031271BBE0>
2212217600992
<class '__main__.Person'>

类也是对象(又叫类对象)

刚刚我们说了一切都是对象,实例(真实的车)是对象,类(模具车)当然也是对象,因为它也是实实在在存在的东西。

当 Python 解释器执行到关键字 class 这个指令的时候,在内部就会创建一个名为 “Person” 的类,这个类也是个对象,我们称之为类对象(注意区别实例对象),它一样有ID标识、有类型、有值。例如:

print(Person)
print(id(Person))
print(type(Person))
<class '__main__.Person'>
2446546123192
<class 'type'>
我们注意到Person这个类对象的类型叫“type”,也就是说Person类是由type创建出来的,现在你要记住,p1,p2 是实例对象,而Person是类对象,实例对象p1的类型是类对象Person,Person的类型是type。另外,这个type是什么鬼?

我们来回顾一下:

i=10
print("对象的类型为:"+str(type(i)))
print("对象的类型为:"+str(type(int)))
对象的类型为:<class 'int'>
对象的类型为:<class 'type'>
i的类型是int,int的类型也是type,所有类的类型都是type,也就是说所有的类都是由type创建的。这个type就是元类(metaclass),元类是用于创建类的类,道生一,一生二,三生万物,元类就是Python中的造物主。(元类自己也是对象)

现在我们都知道类(对象)可以使用class关键字创建,我们还知道类(对象)的类型是type,既然知道了它的类型是type,那么肯定可以通过type(元类)来创建。

用元类创建类

前面讲到过,type有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

Person1 = type("Person1", (), {"live":True})
print(Person1)

Person就是一个类,它等价于:

class Person1:
    live = True
print(Person1)
<class '__main__.Person1'>
用元类type创建类的语法是:

type(类名,父类元组(可以为空), 属性字典)

小结
Python中一切皆为对象,类是对象,元类也是对象,元类是用于创建类的类。


本文章参考公众号【python之禅】,非常感谢!
链接:https://mp.weixin.qq.com/s/UTFQgu4q5pHFyQZBWA9qpA

查看评论

Number类

-
  • 1970年01月01日 08:00

深入理解python元类

类和对象在理解什么是元类之前,有必要先理解下,什么是类。 什么是类?通俗的讲,类就是用来创建对象的代码片。在python中,类还有一个奇特的特性,就是类,本身也是一个对象。怎么理解?——在你定义一个类...
  • Allenalex
  • Allenalex
  • 2017-01-09 20:57:18
  • 2415

python元类解析

分享下自己对python的metaclass的知识。   一 你可以从这里获取什么? 1. 也许你在阅读别人的代码的时候碰到过metaclass,那你可以参考这里的介绍。 2....
  • permike
  • permike
  • 2016-08-15 15:37:24
  • 1652

Objective-C对象模型--类对象和元类对象

参考: Objective-C对象之类对象和元类对象(一) Objective-C对象模型及应用 参看以上文章基本可以了解Objective-C对象模型模型了, 可做学习: ...
  • iunion
  • iunion
  • 2015-07-15 10:41:22
  • 3409

[Python]五分钟理解元类(Metaclasses)

  • lanphaday
  • lanphaday
  • 2008-10-10 11:34:00
  • 24639

iOS class深入理解: 实例对象、类对象、元类和isa指针

你要知道的class都在这里
  • opooc
  • opooc
  • 2017-12-25 23:46:29
  • 1459

python总结(六):元类与方法的默认实现

通过元类,可以修改类的方法与实现,根据“_ init_”与“_ new_”方法钩子的不同,可以在类创建后与类创建前添加控制,在类创建前可提供默认实现,在类创建后可以提供方法检查、属性检查与覆盖实现。在...
  • yiifaa
  • yiifaa
  • 2017-09-25 22:05:22
  • 210

python中元类的__call__方法的作用

元类是类的类,元类之于类就相当于类之于实例。元类的new方法会创建一个类并返回,就像类的new方法会创建一个实例并返回一样。元类中其他方法的定义类似于类中方法的定义,例如:class Meta(typ...
  • tuxinhang
  • tuxinhang
  • 2017-12-07 15:48:22
  • 379

python中的元类Metaclass

python中的元类Metaclass理解元类之前需要学习的知识如果说让我们创建一个类,最先想到的肯定是用class创建,当我们使用class创建类的时候,python解释器自动创建这个对象,但是py...
  • weixin_35955795
  • weixin_35955795
  • 2016-10-31 19:17:33
  • 3348

清晰理解Objective-C元类

看了几篇别的博客感觉讲得绕来绕去,让人看了之后感觉似懂非懂,这里就总结一下。如有不当之处请读者指出。元类是什么众所周知Objective-C(以下简称OC)中的消息机制。消息的接收者可以是一个对象,也...
  • zengxu2011
  • zengxu2011
  • 2015-12-03 18:02:52
  • 2520
    个人资料
    持之以恒
    等级:
    访问量: 7521
    积分: 423
    排名: 12万+