本篇文章给大家分享的是有关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元类(元)是什么