Python元类

时间:2020-02-23 14:43:01  来源:igfitidea点击:

欢迎使用今天有关python元类的教程。
我们都知道python是一种面向对象的编程语言,这意味着它可以将数据与功能即类绑定在一起。
希望在开始介绍python元类之前,我们希望您了解类和继承的概念。
如果您不了解,可以先学习python类和python继承。

Python元类

Python元类是实例化一个类的类。
在python中,一个类实际上是另一个类的对象。
这另一个类称为元类。
python中的元类定义了类对象的行为。
让我们看一些例子,以清楚地了解元类的概念。

Python内置的元类

type是python中内置的元类。
让我们从以下示例开始:

class SampleClass():
 pass
obj = SampleClass()
print(type(obj))

在上面的代码中,我们创建了一个名为" SampleClass"的类,并创建了一个对象。
然后对象类型说:

class '__main__.SampleClass'

这意味着" obj"是" SampleClass"的对象。
现在,如果我们尝试查看" SampleClass"本身的类型,如下所示:

print(type(SampleClass))

然后输出是:

class 'type'

这意味着" SampleClass"是" type"类的对象。
更具体地说," SampleClass"是类" type"的实例。
所以type是一个元类。
python的每个类都属于内置的元类type。

python元类如何工作?

每当我们创建任何类时,都会调用默认的元类。
通过三个信息调用该元类-类的名称,类的基类集和类的属性。

因为type是内置的元类,所以每当我们创建一个类类型时,都会使用这三个参数来调用它。

我们说的是python中的每个类也是" type"的对象,这意味着我们可以在一行中创建任何类,就像我们创建任何类的对象一样。
这种创建类的方法称为"即时创建类"。

使用元类创建python类

因此,使用metaclasstype,您可以通过以下方式在一行中创建类:

Student = type('Student', (), {})

这将在代码运行时创建一个名为Student的类。
上一行等效于以下代码:

class Student:
 pass

如果继承其他某个类,例如Department,那么我们编写如下,

class Student(Department):
 pass

快速创建类时,应在第二个参数中提供继承的类,

Student = type('Student', (Department,), {})

如果Student类包含一些属性和函数,则应在第3个参数中将它们作为键值对提供。
请参阅以下示例:

class Student:

 def __init__(self, name, roll):
     self.name = name
     self.roll = roll
     self.marks = 0.0

可以按以下方式添加这些属性和功能:

def init(self, name, roll):
 self.name = name
 self.roll = roll
 self.marks = 0.0

Student = type('Student', (), {'__init__' : init})

注意,在使用函数之前,我们已经定义了该函数。
我想让您了解的另一件事是,第一个参数是类名。
因此,如果您编写如下:

Student = type('StudentClass', (), {'__init__' : init})
obj = Student("Zinia", "59")
print(obj.__class__)

然后输出将是

class '__main__.StudentClass'

因此,最好对类和变量使用相同的名称,以保持一致性。

设置元类

您可以显式设置类的元类。
每当python获取关键字class时,它都会搜索元类。
如果未找到,则使用默认的元类类型创建该类的对象。
您可以使用__metaclass__属性来设置类的元类,如下所示:

class SomeClass:
 __metaclass__ = type
 # other methods...

print(SomeClass.__metaclass__)

它将产生如下输出:

class 'type'

在Python中创建元类

最后,您还可以创建自己的元类来定义使用该类创建的任何类的行为。

为此,您的类必须继承默认的元类type,因为这是主要的元类。