美文网首页
《Python 核心技术与实战》 学习笔记 Day17 meta

《Python 核心技术与实战》 学习笔记 Day17 meta

作者: _相信自己_ | 来源:发表于2023-01-31 23:06 被阅读0次

metaclass 的超越变形特性有什么用?

YAML是一个家喻户晓的 Python 工具,可以方便地序列化 / 逆序列化结构数据。YAMLObject 的一个超越变形能力,就是它的任意子类支持序列化和反序列化(serialization & deserialization)。比如说下面这段代码:

class Monster(yaml.YAMLObject):
  yaml_tag = u'!Monster'
  def __init__(self, name, hp, ac, attacks):
    self.name = name
    self.hp = hp
    self.ac = ac
    self.attacks = attacks
  def __repr__(self):
    return "%s(name=%r, hp=%r, ac=%r, attacks=%r)" % (
       self.__class__.__name__, self.name, self.hp, self.ac,      
       self.attacks)

yaml.load("""
--- !Monster
name: Cave spider
hp: [2,6]    # 2d6
ac: 16
attacks: [BITE, HURT]
""")

Monster(name='Cave spider', hp=[2, 6], ac=16, attacks=['BITE', 'HURT'])

print yaml.dump(Monster(
    name='Cave lizard', hp=[3,6], ac=16, attacks=['BITE','HURT']))

# 输出
!Monster
ac: 16
attacks: [BITE, HURT]
hp: [3, 6]
name: Cave lizard

我们需要一个全局的注册器,让 YAML 知道,序列化文本中的 !Monster 需要载入成 Monster 这个 Python 类型。

Python 底层语言设计层面是如何实现 metaclass 的?

第一,所有的 Python 的用户定义类,都是 type 这个类的实例。
第二,用户自定义类,只不过是 type 类的call运算符重载。
第三,metaclass 是 type 的子类,通过替换 type 的call运算符重载机制,“超越变形”正常的类。

使用 metaclass 的风险

只有深入理解 metaclass 的本质,你才能用好 metaclass。

metaclass 仅仅是给小部分 Python 开发者,在开发框架层面的 Python 库时使用的。而在应用层,metaclass 往往不是很好的选择。

相关文章

  • Python核心技术与实战笔记目录

    参考资料: 极客时间 Python核心技术与实战学习 Python核心技术与实战(极客时间)链接:http://g...

  • Python对象的比较和拷贝

    李文轩 2019-08-17声明:这是本人学习极客时间的Python核心技术与实战的笔记,有侵权请联系我。 ' =...

  • Python03 字符串

    以下主要是听极客时间:Python核心技术与实战时做的笔记 字符串是python一种常见的数据类型,比如函数的注释...

  • Python02 数据结构:字典和集合

    以下主要是听极客时间:Python核心技术与实战时做的笔记 对于每一门编程语言,数据结构都是重中之重。对于Pyth...

  • Python01 数据结构:列表和元组

    以下主要是听极客时间:Python核心技术与实战时做的笔记 对于每一门编程语言,数据结构都是重中之重。对于Pyth...

  • 极客时间

    我的已购专栏。 左耳听风 黄勇的OKR实战笔记 Kafka核心技术与实战 OpenResty从入门到实战 Java...

  • Redis线程那些事

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 Red...

  • 针对Redis内存碎片以及缓冲区溢出的优化

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 1、内...

  • Redis缓存淘汰策略

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 1、淘...

  • Redis切片集群

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 切片集...

网友评论

      本文标题:《Python 核心技术与实战》 学习笔记 Day17 meta

      本文链接:https://www.haomeiwen.com/subject/nowbhdtx.html