问题标签 [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 投票
1 回答
646 浏览

python - 如何在 Python 中创建一个行为类似于 Django 抽象基类的类?

我正在使用现有的 Django 库,并且正在创建一个我想要抽象的类。

假设有问题的班级是BaseFoo.

目前,实现有一个基类BaseFoo

每次BaseFoo创建扩展类时,元类都会将其添加到类列表中。它明确不BaseFoo通过对类名进行硬编码测试来添加:

我希望能够写出类似的东西:

并让元类跳过所有BaseFoo抽象对象。所以我想我想知道 Django 是如何对模型做同样的事情的,以及是否有一种简单、优雅的方式来自己做这件事。

我查看了 Django 用于定义模型的一些代码,但我可以使用一些指针。此外,如果有一种更简单的方法可以做到这一点,而不必使用class Meta我也愿意。

请注意,我对这个解决方案并不特别兴奋:

0 投票
4 回答
15634 浏览

python - 元类混合或链接?

是否可以链接元类?

我有Model用于__metaclass__=ModelBase处理其命名空间字典的类。我将从它继承并“绑定”另一个元类,这样它就不会遮蔽原来的元类。

第一种方法是子类class MyModelBase(ModelBase)

但是是否可以像 mixins 一样将它们链接起来,而不需要显式的子类化?就像是

...甚至更好:创建一个 MixIn ,它将__metaclass__从使用它的类的直接父级中使用:


原因:为了更灵活地扩展现有应用程序,我想创建一个全局机制来挂钩 Django 中的Model,Form​​ , ... 定义的过程,以便可以在运行时更改它。

一个通用的机制比使用回调混合实现多个元类要好得多。


在您的帮助下,我终于想出了一个解决方案: metaclass MetaProxy

这个想法是:创建一个元类,它调用回调来修改正在创建的类的命名空间,然后在 的帮助下__new__,变异成一个父类的元类

0 投票
2 回答
2483 浏览

testing - 如何模拟闭包以测试 Grails 服务结果?

我想对一些类似于此的代码的返回值进行单元测试:

单元测试代码计划:

我怎样才能做到这一点?谢谢!

0 投票
1 回答
1201 浏览

django - Django:为继承参数化 db_table

我想db_table在基类中设置 Meta 类属性,以便所有继承的类都在其中包含它们的名称,类似于 Django 处理related_name模型字段属性的方式:

所以继承模型:

将有分贝表prefix_submodel

那可能吗?Meta 类可以访问继承类的模型名称吗?

0 投票
1 回答
749 浏览

grails - 元编程 XMLSlurper 结果

我啜饮了一个 twitter 提要,其中每个条目看起来像:

等等等等

我在 grails/GSP 中需要做的是显示图像, <img src=${tweet.imgUrl}/> 所以这看起来是对 XML 结果进行元编程的一个很好的案例,但作为 Groovy nooby,我遇到了麻烦。

看看至少有 2 个“链接”节点,图片 url 有一个rel="image"属性。所以我试过...

但是像这样的错误我无法超越:

任何帮助表示赞赏

0 投票
3 回答
5933 浏览

python - 在@property 之后修饰一个类方法

我想包装各种对象的每个方法,除了__init__使用装饰器。

但是,属性实例结果的包装等价于:

当期望的结果与此等效时:

似乎属性对象的属性是只读的,防止在属性包装后修改函数。我对已经要求的黑客级别不太满意,无论如何我都不想深入研究属性对象。

我能看到的唯一其他解决方案是动态生成一个我希望避免的元类。我错过了一些明显的东西吗?

0 投票
3 回答
1052 浏览

collections - 如何使 Groovy 数组具有可比性?

像这样尝试:

它不起作用。

仍有异常上涨groovy.lang.GroovyRuntimeException: Cannot compare java.util.ArrayList with value '[1]' and java.util.ArrayList with value '[2]'

0 投票
4 回答
685 浏览

python - 使用任意替换的属性名称创建 Python 类

我很抱歉没有给这个问题一个更好的标题;我发布它的原因是我什至没有正确的术语来知道我在寻找什么。

我已经定义了一个具有“垃圾邮件”属性的类:

我想创建一个(子/兄弟?)类,它具有完全相同的功能,但具有名为“eggs”而不是“spam”的属性:

概括地说,如何创建具有任意属性名称的功能相同的类?当类具有复杂的行为时,重复代码似乎很愚蠢。

更新:我同意这闻起来像是糟糕的设计。澄清一下,我并不是想以这种愚蠢的方式解决特定问题。我只想知道如何__dict__在保留功能的同时任意命名对象的(非魔法)内容。考虑类似对象的keys()方法dict。人们使用符合约定的方法创建各种类,keys()命名约定是一件好事。但是这个名字是随意的。如何在不手动替换源中的 /keys/spam/ 的情况下使用spam()完全替换的方法创建一个类?keys()

重载__getattr__和朋友引用泛型属性对我来说似乎不优雅和脆弱。如果子类重新实现这些方法,它必须适应这种行为。我宁愿让用户觉得只有一个带有命名属性的基类,可以天真地访问。

实际上,我可以想到一个合理的用例。假设您想要一个具有特殊属性的 mixin 类和一些密切相关的方法来操作或依赖于该属性。用户可能希望在重用底层行为的同时,为不同的类以不同的方式命名这个特殊属性(以匹配实际问题域中的名称或避免名称冲突)。

0 投票
3 回答
11347 浏览

python - 在 Python 中使类不可变的方法

我正在做一些分布式计算,其中几台机器在假设它们都具有各种类的相同版本的情况下进行通信。因此,使这些类不可变似乎是一个不错的设计。并不是说它必须阻止怀有恶意的用户,它只是足够不变,以至于它永远不会被意外修改。

我该怎么办?例如,我将如何实现一个元类,使使用它的类在定义后不可变?

替代方法也很好,例如接受一个类并返回一个不可变类的装饰器/函数。

0 投票
1 回答
209 浏览

python - 在 Python 中使用 `with` 的不同类

如果您有以下课程:

然后你在一个名为 check_foo.py 的文件中像这样使用它

如果你导入check_foo并运行dir(check_foo),你只会得到一个check_foo.Foo模块。

我知道 PEP 343 提到您可以执行以下操作:

check_foo并且它会在as中正确实例化,check_foo.naming_it但我的问题是可以解决这个问题并动态设置名称。

我正在玩概念证明,想知道我能用上述想法走多远。

是否可以使用我传递给的字符串命名实例Foo

注意:我也知道withhacks. 我们不建议我看一下:)