Python元类(元)是什么

  介绍

本篇文章给大家分享的是有关Python元类(元)是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>什么是元类?

理解元类(元)之前,我们先了解下Python中的OOP和类(类)。<强>面向对象全称面向对象编程简称OOP,这种编程思想被大家所熟知。它是把对象作为一个程序的基本单元,把数据和功能封装在里面,能够实现很好的复用性,灵活性和扩展性.OOP中有2个基本概念:类和对象:

<强>类是描述如何创建一个对象的代码段,用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法

对象是类的实例(实例)。

我们举个例子:

拷贝:,class  ObjectCreator(对象):   …:,,,,,   …:=:拷贝,my_object  ObjectCreator ()   拷贝:my_object   :,& lt; __main__.ObjectCreator  at  0 x1082bbef0>

而Python中的类并不是仅限于此:

拷贝:,打印(ObjectCreator)   & lt; class  & # 39; __main__.ObjectCreator& # 39;在

ObjectCreator竟然可以被印刷,所以它的类也是对象!既然类是对象,你就能动态地创建它们,就像创建任何对象那样。我在日常工作里面就会有这种动态创建类的需求,比如在模拟数据的时候,现在有个函数func接收一个参数:

拷贝:,def  func(实例):   …:,,,,,印刷(instance.a, instance.b)   …:,,,,,印刷(instance.method_a (10))   …:

正常使用起来传入的实例是符合需求的(有a、b属性和method_a方法),但是当我想单独调试函数的时候,需要“造”一个,假如不用元类,应该是这样写:

拷贝:,def  generate_cls (a, b):   …:,,,,,class 假(对象):   …:,,,,,,,,,def  method_a(自我,,n):   …:,,,,,,,,,,,,,return  n   …:,,,,,Fake.a =,   …:,,,,,Fake.b  b=,   …:,,,,,return 假的   …:=:拷贝,ins  generate_cls (1, 2) ()   拷贝:ins.a, ins.b,, ins.method_a (10)   :,(1,,2,,10)

你会发现这不算算是“动态创建”的:

<强>类名(假的)不方便改变

要创建的类需要的属性和方法越多,就要对应的加码,不灵活。

我平时怎么做呢:

拷贝:,def  method_a(自我,,n):   …:,,,,,return  n   …:   拷贝:ins =,类型(& # 39;假# 39;,,(),,{& # 39;一个# 39;,,1,,& # 39;b,,, 2,, & # 39; method_a& # 39;:, method_a}) ()   拷贝:ins.a, ins.b,, ins.method_a (10)   :,(1,,2,,10)

到了这里,引出了类型函数。本来它用来能让你了解一个对象的类型:

拷贝:,式(1)   :int   拷贝:类型(& # 39;1 & # 39;)   :str   拷贝:类型(ObjectCreator)   :类型   拷贝:类型(ObjectCreator ())   :__main__。ObjectCreator

另外,如类型上所说还可以动态地创建类:类型可以把对于类的描述作为参数,并返回一个类。

用来创建类的东东就是“元类”

MyClass =,类型(& # 39;myclass # 39;,, (),, {})

这种用法就是由于类型实际上是一个元类,作为元类的类型在Python中被用于在后台创建所有的类。在Python语言上有个说法“一切都是对象”。包整数,字符串,函数和类…所有这些都是对象。所有这些都是由一个类创建的:

拷贝:,age =35   拷贝:age.__class__   :int=:拷贝,name  & # 39;鲍勃# 39;   拷贝:name.__class__   :str   …

现在,任何__class__进行中的特定__class__进行是什么?

拷贝:age.__class__.__class__   :类型   拷贝:name.__class__.__class__   :类型   …

如果你愿意,你可以把类型称为“类工厂“.type是Python中内建元类,当然,你也可以创建你自己的元类。

<强>创建自己的元类

Python2创建类的时候,可以添加一个__metaclass__属性:

class  Foo(对象):   ,,,__metaclass__ =,东西……   ,,,[…)

如果你这样做,Python会使用元类来创建Foo这个类.Python会在类定义中寻找__metaclass__。如果找到它,Python会用它来创建对象类Foo。如果没有找到它,Python将使用类型来创建这个类。

在Python3中语法改变了一下:

class  Simple1(对象,,元类=?:   ,,,[…)

Python元类(元)是什么