python 面向对象你都会?元类了解一下!

python 面向对象你都会?元类了解一下!

一、万物皆对象

在大家学习 python 的时候,一定听说过一句话:在我们 python 中万物皆对象,不管是整数、字符串、列表、字典这些基本数据类型,还是函数、以及自定义类创建出来的对象,在 python 中它们都是对象,如果我们想知道一个对象的类型,可以通过 type 函数来查看,type 返回出来的就是创建这个对象的类。

#查看整数的类型
print('整数的类型',type(10))

#查看函数的类型
def func():
    pass
print('函数的类型:',type(func))

#查看自定义类创建出来的对象类型
class TestClass:
    pass
obj_t = TestClass()
print('自定义类创建的对象类型:',type(obj_t))

运行结果:

整数的类型 <class 'int'>
函数的类型: <class 'function'>
自定义类创建的对象类型: <class '__main__.TestClass'>

在上面的运行结果中我们可以看到自定义的类创建出来的对象,type 返回出来的就是我们自定义的这个类(__main__ 代表的是当前这个模块), type(10)返回的结果是 int,也就是说 10 是 int 这个类创建出来的,自定义的函数 func 是 function 这个类创建出来的,我们可以看一下 int 的源码中可以看到,它就是一个类,不仅如此,python 的基本数据类型,每一个类型都是一个类。

#int源码
class int:
    @overload
    def __init__(self, x: Union[str, bytes, SupportsInt] = ...png) -> None: ...
    @overload
    def __init__(self, x: Union[str, bytes], base: int) -> None: ...

    def bit_length(self) -> int: ...
    def to_bytes(self, length: int, byteorder: str, *, signed: bool = ...png) -> 
    '''下面省略若干行代码'''

function 的源码,同样也是一个类

class function:
    # TODO not defined in builtins!
    __name__ = ...  # type: str
    __qualname__ = ...  # type: str
    __module__ = ...  # type: str
    __code__ = ...  # type: CodeType
    __annotations__ = ...  # type: Dict[str, Any]
    '''下面省略若干行代码'''

二、类也是对象

在上面我们知道了 python 中所有的内置数据类型,以及函数都是由类创建出来的,那么这个时候肯定会由疑问。

问题一:对象是由类创建出来的,那么类是不是对象?类又是由什么创建出来的?

python 中万物皆对象,当然也包括类,类也是对象,至于类是由什么创建出来的,我们可以通过 type 函数来看一下

class TestClass(object):
    pass
obj_t = TestClass()
print(type(obj_t))
print(type(TestClass))

#运行结果
>>> <class '__main__.TestClass'>
>>> <class 'type'>

在上面的结果中我们可以看到:

问题二:type 查看类的类型返回出来的是 type,type 不是个内置函数吗?

正如上面的结果所示,你没看错,类的类型是 type,类就是由 type 创建出来的,type 虽然我们把它叫做 python 的内置函数,但其实它是一个类,我们一起来看一下它的源码。

class type(object):
    """
    type(object_or_name, bases, dict)
    type(object) -> the object's type
    type(name, bases, dict) -> a new type
    """
    def mro(self, *args, **kwargs): # real signature unknown
        """ Return a type's method resolution order. """
        pass
    '''下面省略若干行代码'''

在 type 的源码的文档注释中我们可以看到,type 不仅可以用来查看对象的类型,它还可以用来创建一个新的类。

到这里,我们明确的知道了类也是对象,类是由 type 这个类创建出来的对象,那么 type 是由什么创建出来的呢?

问题三:类是由 type 创建出来的,那么 type 这个类呢,它是什么类型?

在我们柠檬版有一句话,能动手就绝不动口,实践出真知,这里我们可以动手通过代码来查看一下 type 到底是由什么创建出来的。

print(type(type))

#运行结果
>>> <class 'type'>

从上面的代码中我们可以看到,type 是这个类也是 type 类型,就是说 type 也是 type 创建出来的。

到这里我们可以理一下思路,python 中万物皆对象,所有的对象都是类创建的,而类又是由 type 创建的,那么 type 到底是什么呢?

三、元类

好了,也不跟大家卖关子了,type 它究竟是什么呢?type 其实就是我们所说的元类,在 python3 中所有的类都是 type 这个元类创建出来的。下面给大家来画个图来了解一下。

image.png

问题:元类到底有什么用?

“元类比 99%的用户所忧虑的东西具有更深的魔法。如果你犹豫考虑是否需要它们,那么实质上你不会需要它们(实际需要它们的人确信他们确实需要,并且不需要进行任何解释)。“ —— 蒂姆·彼得斯

关于元类就给大家简单的介绍到这里,如果想更加深入的了解面向对象,以及更多元类相关的知识点和应用,请关注我们的测试开发课程,测试开发课程中,针对面向对象和元类会有更加深入的讲解。

1 操作
nmb_musen 在 2020-08-06 17:40:45 更新了该帖
3 回帖
请输入回帖内容 ...
  • jomer3126

    碰擦灵感的火花,放飞五彩的思绪;投入全部的身心,开启智慧的大门;敲击熟悉的键盘,点击快乐的鼠标;汇成开心的格式,出炉美妙的程序。程序员节,愿你拥有大智慧,不断编写精彩,缔造辉煌!5352

  • 其他回帖
  • jomer3126

    碰擦灵感的火花,放飞五彩的思绪;投入全部的身心,开启智慧的大门;敲击熟悉的键盘,点击快乐的鼠标;汇成开心的格式,出炉美妙的程序。程序员节,愿你拥有大智慧,不断编写精彩,缔造辉煌!6646

  • test123

    文章通俗易懂,内容很有用