Python中的metaclass

Python 中有很多黑魔法,比如今天我将分享的 metaclass。我认识许多人,对于这些语言特性有两种极端的观点。

  • 一种人觉得这些语言特性太牛逼了,简直是无所不能的阿拉丁神灯,必须找机会用上才能显示自己的 Python 实力。
  • 另一种观点则是认为这些语言特性太危险了,会蛊惑人心去滥用,一旦打开就会释放“恶魔”,让整个代码库变得难以维护。

市面上的很多中文书,都把 metaclass 译为“元类”。我一直认为这个翻译很糟糕,所以也不想在这里称 metaclass 为元类。因为如果仅从字面理解,“元”是“本源”“基本”的意思,“元类”会让人以为是“基本类”。难道 Python 的 metaclass,指的是 Python 2 的 Object 吗?这就让人一头雾水了。

事实上,meta-class 的 meta 这个词根,起源于希腊语词汇 meta,包含下面两种意思:

  • “Beyond”,例如技术词汇 metadata,意思是描述数据的超越数据;
  • “Change”,例如技术词汇 metamorphosis,意思是改变的形态。

metaclass,一如其名,实际上同时包含了“超越类”和“变形类”的含义,完全不是“基本类”的意思。所以,要深入理解 metaclass,我们就要围绕它的超越变形特性。接下来,我将为你展开 metaclass 的超越变形能力,讲清楚 metaclass 究竟有什么用?怎么应用?Python 语言设计层面是如何实现 metaclass 的 ?以及使用 metaclass 的风险。

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

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


class Monster(yaml.YAMLObject):yaml_tag = u'!Monster'def __init__(self, name, hp, ac, attacks):self.name = nameself.hp = hpself.ac = acself.attacks = attacksdef __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],


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部