Python元类
欢迎使用今天有关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
,因为这是主要的元类。