Python的元类如何使用


本文摘自php中文网,作者php中世界最好的语言,侵删。

这次给大家带来Python的元类如何使用,使用Python元类的注意事项有哪些,下面就是实战案例,一起来看一下。

今天我的任务就是彻底明白什么是元类,一起看看。

要搞懂元类,我们还是先从对象说起。

对象(Object)

Python 一切皆对象,这句话你一定有听说过(现在你就听说了),一个数字是对象,一个字符串是对象,一个列表是对象,一个字典是对象,例如:

1

2

3

4

>>> i = 10

>>> s = "abc"

>>> nums = [1,2,3]

>>> dicts = {"name":"zhang"}

等号右边是对象,左边是给这些对象取的名字,任何对象都有3个关键属性:标识、值、类型。

标识

标识就和人的身份证ID一样,每个对象有唯一ID标识,在整个生命周期中都不会变,你可以认为标识是这个对象在计算机内存中的地址。通过函数 id() 可以查看对象的ID标识。

1

2

3

4

>>> id(i)

40592592

>>> id(s)

44980584

对象值

对象的第二个属性是值,值很好理解,比如 i 的值是 10,s 的值是 abc,nums 的值就是 1,2,3。

类型

对象还有一个很重要的属性就是类型,任何对象都有属于自己的类型,对象就是由它的类型构造出来的,比如上面的 i 的类型是 int 类型,这个对象就是由 int 构造出来的。s 类型是字符串类型,nums 的类型是列表类型,dicts 的类型是字典类型,它们都是由对应的类型构建出来的。

通过 type() 可以查看对象的类型。

1

2

3

4

5

6

7

8

>>> type(i)

<class 'int'>

>>> type(s)

<class 'str'>

>>> type(nums)

<class 'list'>

>>> type(dicts)

<class 'dict'>

对象的类型也和ID标识一样,确定好之后就不会再变化了。

类与(实例)对象

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

1

2

3

4

5

6

7

>>> class Person:

  # 这里的 self 指某个实例对象自己

...  def init(self, name):

   # name 是实例的属性

...   self.name = name

  # live 是类的属性

  live = True

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

1

2

3

4

5

6

7

>>> p1 = Person("zhangsan")

>>> p1.name

'zhangsan'

>>>

>>> p2 = Person("lisi")

>>> p2.name

'lisi'

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

1

2

3

4

>>> p1

<main.Person object at 0x0195AA30>

>>> type(p1)

<class 'main.Person'> # 这里的main是模块名称

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

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

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

1

2

3

4

5

6

>>> id(Person)

26564024

>>> type(Person)

<class 'type'>

>>> Person

<class 'main.Person'>

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

我们来回顾一下,实例对象 p1 的类型是类对象 Person,Person 的类型 type

1

2

3

4

5

>>> 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 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。

1

2

3

>>> Person = type("Person", (), {"live":True})

>>> Person

<class 'main.Person'>

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

1

2

3

4

5

>>> class Person:

...  live = True

...

>>> Person

<class 'main.Person'>

用元类 type 创建类的语法是:

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Python实现求解最大公约数的方法

在python中numpy与array应该怎样转换

以上就是Python的元类如何使用的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

Python可以开发什么

总结Python常用的机器学习库

Python如何合并两个列表

Python软件免费吗

如何通过Python批量处理套娃式文件夹

怎么看Python是否安装成功?

终于介绍Python 3.9

Python tqmd模块实现进度条显示法

Python怎么换行写代码

Python中n是什么意思?

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...