Python 通过函数和常规类编写元类

小夏 科技 更新 2024-01-31

Python 可以通过函数和常规类编写元类。 类对象是通过 type() 在函数和常规类之间创建的。

python 工厂函数定义了一个外部函数,该函数生成并返回嵌套函数,因此调用工厂函数将获得对嵌套函数的引用。 有关详细信息,请参阅 Python 嵌套函数范围

任何可调用对象都可以用作元类,例如函数,只要它接收传递的参数并返回与目标类兼容的对象即可。 因为可调用对象有一个调用(方法。 class 语句还调用 type() 方法,该方法触发 call() 方法。

用法:

定义元类。 

def metafunc(classname,supers,classdict):

passreturn type(classname,supers,classdict)

使用元类。

class classb(classa,metaclass=metafunc)

描述:定义一个工厂函数,该函数接受三个输入参数,将它们馈送到 type() 内置函数中,并返回由 type() 生成的可调用对象类对象。

手动调用 type() 内置函数以创建类对象。 有关详细信息,请参阅 Python 元类模型和类语句协议

classname: 字符串,类名;

supers:元组,用于保存基类;

classdict: 类属性字典;

返回值:创建一个名为 classname 的类对象,类型化为 type。

根据 class 语句协议,metaclass,即 type() 在 class 语句的末尾自动调用。

>>def metafunc(classname,supers,classdict):

print('工厂函数 metafunctype:','classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

return type(classname,supers,classdict)

>class classa:pass

>class classb(classa,metaclass=metafunc):

name='梯形图读取线'

def meth(self,arg):

传递工厂函数 MetaFunctype:

classname: classb

supers:

classdict:

>cb=classb()

>cb.name

梯形图读取线'>>type(metafunc)

>type(classb)

>type(cb)

用法:

定义。 

class supermeta(type):

def __call__(meta,classname,supers,classdict):

passreturn type.__call__(meta,classname,supers,classdict)

class submeta(type,metaclass=supermeta):

def __new__(meta,classname,supers,classdict):

passreturn type.__new__(meta,classname,supers,classdict)

def __init__(class,classname,supers,classdict):

通行证使用。

class classb(classa,metaclass=submeta):pass

描述:通过元类的元类重载 type's call( 方法,显式调用 type 的 call( 方法,以及触发器类型的子类的 new ( 和 init() 方法。

1)定义元类子元,继承类型,指定元类metaclass=supermeta;

2)定义元类的元类supermeta,继承类型,重载调用(method;

3)客户端类classb通过metaclass=submeta指定元类;

4)通过类协议触发元类子元,然后触发元类调用的元类超元(method;

5) Supermeta 的调用方法显式调用类型__call__(

6) type.调用 (调用子类 submeta 的 new ( 和 init (方法;

7) submeta 的 new ( 方法 submeta 显式调用 new ( class 对象,该对象被分配给客户端类 classb;

>>class supermeta(type):

def __call__(meta,classname,supers,classdict):

print('调用 supermetacall:','meta: %s' % meta,'classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

return type.__call__(meta,classname,supers,classdict)

>class submeta(type,metaclass=supermeta):

def __new__(meta,classname,supers,classdict):

print('调用 submetanew:','meta: %s' % meta,'classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

return type.__new__(meta,classname,supers,classdict)

def __init__(class,classname,supers,classdict):

print('调用 submetainit:','class: %s' % class,'classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

print('初始化类对象:',list(class.__dict__.keys())

>class classa:pass

>class classb(classa,metaclass=submeta):

name='梯形图读取线'

def meth(self,arg):

pass 调用 supermetacall:

meta:

classname: classb

supers:

classdict:

调用 submetanew:

meta:

classname: classb

supers:

classdict:

调用 submetainit:

class:

classname: classb

supers:

classdict:

初始化类对象:'__module__', 'name', 'meth', '__doc__']

>cb=classb()

>cb.name

梯形图读取线'>>type(submeta)

>type(supermeta)

>type(classb)

>type(cb)

用法:

定义。 

class supermeta:

def __call__(self,classname,supers,classdict):

class=self.__new__(classname,supers,classdict)

self.__init__(class,classname,supers,classdict)

passreturn class

class submeta(supermeta):

def __new__(self,classname,supers,classdict):

passreturn type(classname,supers,classdict)

def __init__(self,class,classname,supers,classdict):

通行证使用。

class classa:pass

class classb(classa,metaclass=submeta())pass

描述:通过常规类模拟元类的元类,重载 call( 方法,调用子类的新方法,并显式调用 type() 以创建类对象以将值分配给客户端类。

1)定义常规类supermeta模拟类的元类;

2) Supermeta 定义了 call(方法,调用子类 submeta new(和 init(method;

3) Supermeta 返回客户端类类

4)定义正则类submeta,继承supermeta,作为客户端类的元类;

5) submeta 的 new (方法,它显式调用 type() 方法来创建一个类对象,并返回分配给客户端类的值

6) submeta 的 init(方法,用于初始化类对象;

7)定义客户端类classb,指定元类metaclass=submeta()实例对象;

8)类协议自动调用实例对象submeta()的调用(方法),搜索supermeta的调用(方法),触发元类submeta的new和init方法

>>class supermeta:

def __call__(self,classname,supers,classdict):

print('调用 supermetacall:','classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

class=self.__new__(classname,supers,classdict)

self.__init__(class,classname,supers,classdict)

return class

>class submeta(supermeta):

def __new__(self,classname,supers,classdict):

print('调用 submetanew:','classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

return type(classname,supers,classdict)

def __init__(self,class,classname,supers,classdict):

print('调用 submetainit:','class: %s' % class,'classname: %s' % classname,'supers: %s' % supers,'classdict: %s' % classdict,sep='')

print('初始化类对象:',list(class.__dict__.keys())

>class classa:pass

>class classb(classa,metaclass=submeta())

name='梯形图读取线'

def meth(self,arg):

pass 调用 supermetacall:

classname: classb

supers:

classdict:

调用 submetanew:

classname: classb

supers:

classdict:

调用 submetainit:

class:

classname: classb

supers:

classdict:

初始化类对象:'__module__', 'name', 'meth', '__doc__']

>cb=classb()

>cb.name

梯形图读取线'>>type(submeta)

>type(supermeta)

>type(classb)

>type(cb)

相似文章

    Python 中格式函数的用法

    在 Python 编程中,格式化输出是一项非常重要的操作,可以使数据更加直观和易于理解。Python 中的 format 函数是实现格式化输出的主要方法之一。它可以将变量插入到字符串中,并以某种格式排列和显示它们。基本用法 最基本的用法是使用位置参数。在字符串 中使用大括号来指示需要插入变量的位置,...

    Python 中示例函数的用法

    在 Python 中,sample 函数用于从指定的事件空间中随机选择指定数量的样本。它通常用于统计学 机器科学 习等领域,在处理数据集时特别有用。下面是如何使用示例函数的示例 python import numpy as np 创建一个包含 个元素的一维数组。data np.array ,,,,,...

    Python计数函数计数,综合分析,实用指南

    在 Python 中,计数函数 count 是一个非常有用的内置函数,用于计算序列中元素的出现次数。本文将详细介绍 count 函数的使用,以帮助读者更好地理解和应用它。基本用法。count 函数的基本用途是计算序列中元素的出现次数。其基本语法为 sequence.count value 其中 se...

    如何使用python计数函数count

    Python 的计数函数 count 可用于计算可哈希对象中每个元素的出现次数。使用计数器类及其计数方法,我们可以轻松完成此任务。另外,请注意,只能计算可哈希对象。导入所需的库 在 Python 中使用 count 函数之前,您需要导入集合库。该库提供了许多有用的工具,其中之一是计数器类。技能习 考...

    range 函数的 Python 用法

    range 是 Python 中的一个内置函数,用于创建整数序列,通常用于 for 循环。了解 range 的使用将有助于我们使用循环。range 函数的语法格式如下 start 序列的起始值,默认从 开始。stop 序列末尾的值 不包括在序列中 step 步长,默认为 .只有一个参数。range ...