python - Ruby 对 Python 元类的模拟是什么?

标签 python ruby metaprogramming metaclass

Python 具有元类的概念,如果我理解正确的话,它允许您在构造时修改类的对象。您不是在修改类,而是修改要创建然后初始化的对象。

Python(我相信至少从 3.0 开始)也有类装饰器的概念。同样,如果我理解正确,类装饰器允许在声明类定义时对其进行修改。

现在我相信在 Ruby 中有一个或多个与类装饰器等效的功能,但我目前不知道与元类等效的东西。我敢肯定,您可以轻松地通过一些函数来抽取任何 Ruby 对象,并按照您的意愿对其进行操作,但是语言中是否有一种功能可以像元类那样进行设置?

再一次,Ruby 是否有类似于 Python 的元类的东西?

编辑 我不在乎 Python 的元类。元类和类装饰器做的事情看起来非常相似。它们都在定义时修改类,但方式不同。希望 Python 大师能进来,更好地解释 Python 中的这些特性。

但是一个类或一个类的父类可以实现一个 __new__(cls[,..]) 函数,该函数在使用 __init__( self[,..]).

编辑 这个问题主要是为了讨论和学习两种语言在这些特性上的比较。我熟悉 Python 但不熟悉 Ruby,并且很好奇。希望对这两种语言有相同问题的其他人会发现这篇文章很有帮助和启发。

最佳答案

Ruby 没有元类。 Ruby 中有一些结构,有些人有时会错误地称为元类,但实际上并非如此(这是无尽困惑的根源)。

但是,有很多方法可以在 Ruby 中实现与使用元类相同的结果。但是,如果不告诉我们您到底想做什么,就无法说明这些机制可能是什么。

简而言之:

  • Ruby 没有元类
  • Ruby 没有任何一种构造与 Python 的元类相对应
  • Python 可以用元类做的所有事情也可以在 Ruby 中完成
  • 但是没有单一的结构,您将根据自己的具体目的使用不同的结构
  • 这些构造中的任何一个都可能具有不对应于元类的其他特性(尽管它们可能对应于 Python 中的某些其他)
  • 虽然您可以在 Ruby 中做任何您可以在 Python 中使用元类做的事情,但它可能不一定是直截了当的
  • 尽管通常会有更优雅的 Rubyish 解决方案
  • 最后但同样重要的是:虽然您可以在 Ruby 中做任何您可以在 Python 中使用元类做的事情,但这样做可能不一定是 Ruby 之道

那么, 元类到底是什么?好吧,它们是类的类。那么,让我们退后一步:到底是什么?

类……

  • 是对象的工厂
  • 定义对象的行为
  • 在形而上学的层面上定义类实例的意义

例如,Array 类生成数组对象,定义数组的行为并定义“数组性”的含义。

回到元类。

元类……

  • 是类的工厂
  • 定义类的行为
  • 在形而上学的层面上定义类的意义

在 Ruby 中,这三项职责分布在三个不同的地方:

  • Class 类创建类并定义一些行为
  • 单个类的特征类定义了类的一些行为
  • “类性”的概念被硬连线到解释器中,它也实现了大部分行为(例如,您不能从 Class 继承来创建一种查找方法的新类不同的,或者类似的东西——方法查找算法被硬连接到解释器中)

所以,这三个东西一起扮演了元类的角色,但它们都不是元类(每个都只实现了元类所做的一小部分),总和也不是那些元类(因为它们做的远不止这些)。

不幸的是,有些人称类的特征类为元类。 (直到最近,我还是那些误入歧途的灵魂中的一员,直到我终于看到了曙光。)其他人称​​所有特征类为元类。 (不幸的是,其中一位是最流行的 Ruby 元编程和 Ruby 对象模型教程的作者。)一些流行的库向 Object 添加了一个 metaclass 方法,它返回对象的特征类(例如 ActiveSupport、Facets、metaid)。有些人将所有 虚拟类(即特征类和包含类)称为元类。有些人称 Class 为元类。即使在 Ruby 源代码本身中,“元类”一词也用于指代非元类的事物。

关于python - Ruby 对 Python 元类的模拟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676007/

相关文章:

scala - 编译时类型跟踪

c++ - 重新排序可变参数

python - 如何在 Pandas 中的 transpose() 之后删除多余的行(或列)

javascript - 铁路之路 : Send client data to controller using turbolinks

ruby - 除 gem install 之外的任何其他安装 Heroku 的方法

javascript - ruby Watir : Clicking OK on JavaScript Alerts?

haskell - 罗马人、 ruby 和 haskell

python - 重新匹配 ('any item from a list' ) 与 python

python - 安装Python包时出现 "on path"是什么意思?

python - 是否可以在我的 VPS 上运行服务器的情况下从 Google 获取刷新 token ?