加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么是Ruby与Python Metaclasses的模拟?

发布时间:2020-12-16 22:36:25 所属栏目:百科 来源:网络整理
导读:Python具有元类的想法,如果我理解正确,允许您在构建时修改类的对象.你不是修改类,而是要被创建的对象被初始化. Python(至少与3.0相同)也有类装饰器的想法.再次,类装饰器允许修改类定义在它被声明的那一刻. 现在我相信Ruby中的类装饰器有一个等效的功能,但是
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类生成数组对象,定义数组的行为,并定义“array-ness”的意思.

回到元类.

元类…

>是类的工厂
>定义类的行为
>在形而上学层面定义成为一个班级的意义

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

>类类创建类并定义一点行为
>单个类的本征类定义了一些类的行为
>“classness”的概念被硬连接到解释器中,这也实现了大部分的行为(例如,你不能继承Class来创建一种新的类来查找不同的方法,或者类似的方法 – 方法查找算法硬连线到解释器中)

所以,这三个东西一起起到了元类的作用,但是这两者之中的一个都不是元类(每个只实现元类的一小部分),也不是元类的总和(因为它们比那).

不幸的是,有些人称之为类元类的本征类. (直到最近,我是那些被误导的灵魂之一,直到我终于看到了光).其他人称之为所有本征类元类. (不幸的是,其中一个人是Ruby元编程和Ruby对象模型中最受欢迎的教程之一).一些流行的库将一个元类方法添加到Object中,该对象返回对象的本征类(例如ActiveSupport,Facets,metaid).有些人调用所有虚拟类(即本征类和包含类)元类.有些人称Class为metaclass.即使在Ruby源代码本身中,单词“metaclass”也用于指代不是元类的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读