“专业人士笔记”系列目录:
创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!介绍
元类允许通过替换类默认所使用的type元类,来深入修改Python类的行为(如类的定义、实例化、访问等方式)
基本元类
什么是元类呢?现在让我们假设它只是class的父类的一个花哨的名称,继续讲述:
1、在Python中,所有内容都是对象,所以所有内容都有一个类
2、而定义和描述一个类的类称为元类
3、默认的元类都是type,到目前为止,它是最常见的元类;当然,你可以自定义,见后文
type是所有类的元类,如下代码会产生一个新的基于type的类:
Dummy = type('OtherDummy', (), dict(x=1))
print(Dummy.__class__)
print(Dummy().__class__.__class__)
#输出:
<class 'type'>
<class 'type'>
因此,所有的类包括object都是来源于type,它是所有类的元类,可以通过类的继承来创建自定义元类:
class mytype(type):
def __init__(cls, name, bases, dict):
# 调用type元类的构造函数
type.__init__(cls, name, bases, dict)
# 执行自定义初始化
cls.__custom_attribute__ = 2
MyDummy = mytype('MyDummy', (), dict(x=2))
print(MyDummy.__class__)
print(MyDummy().__class__.__class__ )
print(MyDummy.__custom_attribute__) # 输出2 这里是自定义初始化后的输出
#输出:
<class '__main__.mytype'>
<class '__main__.mytype'>
2
metaclass关键字
理论上,任何类的元类都可以单独指定,使用metaclass关键字即可:
class MyClass(metaclass=SomeMetaclass):
pass
在Python中,所有的内容都是对象:整数、字符串、列表,甚至函数和类本身都是对象。每个对象都是一个类的一个实例。要检查对象x的所属的类,可以调用type(x),因此,看看如下代码:
print(type(5)) #<class 'int'>
print(type([1, 2, 3])) #<class 'list'>
class C(object):
pass
print(type(C)) #<class 'type'> 注意,前面讲过,所有的类都继承自元类type
那么,在Python中已经有一个元类:type。我们还能再创造一个吗 ?
class SimplestMetaclass(type):
pass
class MyClass(metaclass=SimplestMetaclass):
__metaclass__= SimplestMetaclass #注意:只在Python2X中有用,Python3中已废弃,只需在类的参数中 metaclass=SimplestMetaclass 即可
print(type(MyClass))
# <class 'main.SimplestMetaclass'> 可以看到,它的元类已变为 SimplestMetaclass 了
但是为什么要了解元类呢?好吧,Python本身是是“可编程”的,如果您正在进行诸如元编程之类的高级工作,或者如果您想控制类的初始化方式,了解元类的概念是很重要的
以上代码在python3云环境下已调试通过,今天的分享就到这里,禁止转载;