Python如何定义有可选参数的元类

 更新时间:2020年07月31日 08:28:43   作者:David Beazley  
这篇文章主要介绍了Python如何定义有可选参数的元类,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

问题

你想定义一个元类,允许类定义时提供可选参数,这样可以控制或配置类型的创建过程。

解决方案

在定义类的时候,Python允许我们使用 ``metaclass``关键字参数来指定特定的元类。 例如使用抽象基类:

from abc import ABCMeta, abstractmethod
class IStream(metaclass=ABCMeta):
  @abstractmethod
  def read(self, maxsize=None):
    pass

  @abstractmethod
  def write(self, data):
    pass

然而,在自定义元类中我们还可以提供其他的关键字参数,如下所示:

class Spam(metaclass=MyMeta, debug=True, synchronize=True):
  pass

为了使元类支持这些关键字参数,你必须确保在 __prepare__() , __new__() __init__() 方法中 都使用强制关键字参数。就像下面这样:

class MyMeta(type):
  # Optional
  @classmethod
  def __prepare__(cls, name, bases, *, debug=False, synchronize=False):
    # Custom processing
    pass
    return super().__prepare__(name, bases)

  # Required
  def __new__(cls, name, bases, ns, *, debug=False, synchronize=False):
    # Custom processing
    pass
    return super().__new__(cls, name, bases, ns)

  # Required
  def __init__(self, name, bases, ns, *, debug=False, synchronize=False):
    # Custom processing
    pass
    super().__init__(name, bases, ns)

讨论

给一个元类添加可选关键字参数需要你完全弄懂类创建的所有步骤, 因为这些参数会被传递给每一个相关的方法。 __prepare__() 方法在所有类定义开始执行前首先被调用,用来创建类命名空间。 通常来讲,这个方法只是简单的返回一个字典或其他映射对象。 __new__() 方法被用来实例化最终的类对象。它在类的主体被执行完后开始执行。 __init__() 方法最后被调用,用来执行其他的一些初始化工作。

当我们构造元类的时候,通常只需要定义一个 __new__() __init__() 方法,但不是两个都定义。 但是,如果需要接受其他的关键字参数的话,这两个方法就要同时提供,并且都要提供对应的参数签名。 默认的 __prepare__() 方法接受任意的关键字参数,但是会忽略它们, 所以只有当这些额外的参数可能会影响到类命名空间的创建时你才需要去定义 __prepare__() 方法。

通过使用强制关键字参数,在类的创建过程中我们必须通过关键字来指定这些参数。

使用关键字参数配置一个元类还可以视作对类变量的一种替代方式。例如:

class Spam(metaclass=MyMeta):
  debug = True
  synchronize = True
  pass

将这些属性定义为参数的好处在于它们不会污染类的名称空间, 这些属性仅仅只从属于类的创建阶段,而不是类中的语句执行阶段。 另外,它们在 __prepare__() 方法中是可以被访问的,因为这个方法会在所有类主体执行前被执行。 但是类变量只能在元类的 __new__()__init__() 方法中可见。

以上就是Python如何定义有可选参数的元类的详细内容,更多关于Python定义元类的资料请关注脚本之家其它相关文章!

相关文章

  • Python web开发之用Tornado框架制作简易表白墙网站

    Python web开发之用Tornado框架制作简易表白墙网站

    这篇文章将用Python做Web开发。在Python当中,WEB开发框架主要有三个,本文将利用Tornado框架做一个简单的表白墙网站,感兴趣的可以了解一下
    2022-02-02
  • Pycharm无法打开双击没反应的问题及解决方案

    Pycharm无法打开双击没反应的问题及解决方案

    这篇文章主要介绍了Pycharm无法打开,双击没反应,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Python 异常处理Ⅳ过程图解

    Python 异常处理Ⅳ过程图解

    这篇文章主要介绍了Python 异常处理Ⅳ过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Python办公自动化SFTP详解

    Python办公自动化SFTP详解

    这篇文章主要介绍了Python办公自动化SFTP详解,sftp和ftp的区别在安全通道,使用的协议,链接方式,安全性等方面都有不同,更多相关内容需要的小伙伴可以参考一下
    2022-08-08
  • pandas 实现 in 和 not in 的用法及使用心得

    pandas 实现 in 和 not in 的用法及使用心得

    pandas按条件筛选数据时,除了使用query()方法,还可以使用isin和对isin取反进行条件筛选,今天通过本文给大家介绍pandas 实现 in 和 not in 的用法及使用心得,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Tensorflow与Keras自适应使用显存方式

    Tensorflow与Keras自适应使用显存方式

    这篇文章主要介绍了Tensorflow与Keras自适应使用显存方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python+opencv实现目标跟踪过程

    python+opencv实现目标跟踪过程

    这篇文章主要介绍了python+opencv实现目标跟踪过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Django利用Cookie实现反爬虫的例子

    Django利用Cookie实现反爬虫的例子

    这篇文章主要介绍了Django利用Cookie实现反爬虫,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 老生常谈python字典用法

    老生常谈python字典用法

    python 创建字典可以使用 dict 函数,或者使用花括号,用花括号的方式更为常见。本文给大家介绍python字典用法,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 使用python3实现操作串口详解

    使用python3实现操作串口详解

    本文给大家介绍的是在python中通过引用serial模块包,来操作串口的方法的示例,有需要的小伙伴可以参考下
    2019-01-01

最新评论