问题标签 [metaclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7524 浏览

python - 用于跟踪子类的通用元类?

我正在尝试编写一个通用元类来跟踪子类

由于我希望这是通用的,我不想在这个元类中硬编码任何类名,因此我想出了一个生成正确元类的函数,例如:

这样我可以调用它来为特定的类生成一个元类:

这是我遇到问题的地方。我不能做到这一点:

...因为Root当我使用make_subtracker(Root). 我稍后尝试添加 __metaclass__ 属性,以便至少可以将其应用于子类:

...但这不起作用。__metaclass__ 在读取类定义时进行特殊处理,如自定义类创建中所定义。

我正在寻找建议以执行此操作(在运行时更改类的元类以将其应用于其子类,或任何其他替代方法)。

0 投票
2 回答
310 浏览

python - 获取该对象元类中对象的参数

我的问题是 python/django 混合。我有一个将显示一些字段的表单模型。根据此模型的某些参数,发送到创建此对象的元类的数据应该不同。但是,在 Meta 的主体内,我怎样才能达到这个参数呢?我应该使用一些全局变量而不是对象参数(因为它只是为了临时存储值而引入的)?

0 投票
1 回答
1176 浏览

groovy - 将一个名为 metaClass 的键放入 Map

我写了一个小 Groovy 脚本,它暴露了一个非常奇怪的行为。谁能解释一下?

在这种情况下,我的问题很简单:为什么最后一条指令会引发以下异常:

0 投票
1 回答
404 浏览

groovy - 如何防止 groovy 创建小写(元)属性名称?

我有问题。我希望有很好的动态 groovy 类来表示丑陋的 XML 结构(不幸的是,JAXB、XmlBeans 等是不可能的)。为此,我需要区分大小写的属性来将元素值从 XML 映射到我的类。

但是由于 JavaBeans 规范,Groovy 会自动生成小写的属性名称。

我可以覆盖此功能并保留我的属性吗?

谢谢

这是一个例子:

源 XML 如下所示:

我用 XmlParser 解析它并让一些类在单独的节点上工作。

由于小写名称,此示例中的结果:我只能找到 2 个元素。

我现在的情况:

我正在使用我的类的纯 Java 部分来获取调用 getDeclaredFields 方法的属性名称。

但这个问题仍然很有趣。

0 投票
2 回答
139 浏览

smalltalk - 是否有没有元类的 Smalltalks?

至少在 Squeak 和 Pharo 中,每个类都有其对应的元类,它包含该类的类方法。每个 Smalltalk 都是这样吗?

0 投票
1 回答
1296 浏览

groovy - 无法使用 GroovyClassLoader 在类中动态更改或添加方法

我尝试从另一个 groovy 脚本动态更改和添加在 groovy 脚本中定义的类的方法,但如果我直接在 .metaClass 中使用类名,我无法弄清楚它为什么会起作用。但如果我使用 GroovyClassLoader 加载类(我需要这样做!)。

在一个文件“MyTest.groovy”中,我有

另一个文件“suite.groovy”包含

使用第一种方法,我得到了预期的结果:

但是第二个我得到

有趣的是,修改现有方法不起作用,但也不例外,但尝试添加新方法会抛出一个。我认为它必须对使用的类加载器做一些事情,但无法弄清楚究竟是什么以及要改变什么!对于第一个版本,这里是类加载器,称为:

对于第二个版本:

欢迎任何想法!
弗兰克

0 投票
1 回答
11998 浏览

methods - 向元类添加方法

我只是在玩 Groovy 中的元类编程。但是突然间我遇到了一个小问题,我无法开始工作......

这是简单的脚本:

是否可以使用该方法但将第一个参数设置为调用对象?使用委托似乎不起作用......不引用调用者的方法的分配没有问题。咖喱在这里有用吗?

谢谢,英戈

0 投票
7 回答
15129 浏览

python - 如何按照声明的顺序读取类属性?

我正在编写一个读取类属性并将它们存储在列表中的元类,但我希望列表(cls.columns)尊重声明顺序(即:mycol2, mycol3, zut, cool, menfin,a在我的示例中):

结果:

这不尊重类Column()属性的声明顺序Listing。如果我classDict直接使用,它也无济于事。

我该如何进行?

0 投票
2 回答
1888 浏览

python - 增强多态身份的 SQLAlchemy 语法

我有一个声明性基类Entity,它将列定义name为多态,例如

在子类中,我现在可以说

并完成。但是,我想简化为我的库的用户创建子类的过程,因此可以实现以下目标:

  • 有一个更好的语法,它不像默认语法那样复杂。这可能是poly_id = "exp"类内部的简单分配,也可能是类装饰器。
  • 如果没有给出 polymorphic_identity,则从子类的名称中提取名称。

我尝试使用元类来完成这项工作(仅第二部分):

因此,在我看来,我Meta应该在调用之前设置名称,DeclarativeMeta但它似乎不起作用。因此,DeclarativeMeta由于我搞砸了 MRO 或者我正在做的事情是完全错误的,所以应该设置多态名称的那个永远不会看到变化。我需要改变什么,或者在 SQLAlchemy 中已经有类似的东西了吗?

0 投票
2 回答
274 浏览

python - 派生时的自动类装饰(或验证)


我有一个基类,从中派生多个子类。
每个子类都定义了类常量,我希望对它们实施某些限制。例如:

我希望能够执行规则(NOM % DENOM == 0)。
我目前使用类装饰器执行此操作:

但我不喜欢我需要装饰每个子类的事实(我有很多)。我很感兴趣这是否可以通过直接对 Base 类进行一些操作来完成。

有什么建议吗?