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

python - Python,Zope 组件架构,注册适配器

在一个独立的 python 应用程序中,我使用zope.interfacezope.component包来注册和访问应用程序的适配器。我想我可以使用元类概念从元类的init方法中注册适配器。这将“自动化”适配器的注册过程。您是否看到这种方法存在问题,例如使用 zope 包添加到类的属性?提前感谢您的意见。

0 投票
5 回答
27022 浏览

python - 有没有办法在类定义之后设置元类?

为了设置一个类的元类,我们使用__metaclass__属性。元类在定义类时使用,因此在类定义之后显式设置它没有效果。

这就是我尝试显式设置元类时发生的情况;

我能想到的最好的主意是重新定义整个类并__metaclass__以某种方式动态添加属性。或者您知道在类定义之后设置元类的更好方法吗?

0 投票
2 回答
1699 浏览

python - unittest 和 metaclass:自动 test_* 方法生成

当我为框架创建测试时,我开始注意到以下模式:

所以我想用元类以编程test_feat_*方式为这些类型的测试类创建方法。换句话说,对于每个带有签名的私有方法,我想要创建两个带有签名和_test_{featname}(self, arg)的顶级可发现方法。test_{featname}_true(self)test_{featname}_false(self)

我想出了类似的东西:

我期望一些输出,例如:

但我得到的是:

看起来我缺少一些关闭规则。我该如何解决这个问题?有更好的方法吗?

谢谢,

编辑:固定。请参阅:片段

0 投票
1 回答
1964 浏览

python - nose, unittest.TestCase and metaclass: auto-generated test_* methods not discovered

This is a follow-up question for unittest and metaclass: automatic test_* method generation:

For this (fixed) unittest.TestCase layout:

This works using stdlib's framework. Expected and actual output:

However, since I am actually using nose, this trick seems to not agree with it. The output I got is:

In short, the test_* methods generated by the metaclass do not register with nose. Can anyone shed a light on this?

Thanks,

0 投票
6 回答
39755 浏览

python - 如何在定义类时自动注册一个类

我想在定义类时注册一个类的实例。理想情况下,下面的代码可以解决问题。

不幸的是,这段代码会产生错误NameError: global name 'MyClass' is not defined

发生的事情是在#problem here我试图实例化 aMyClass但装饰器还没有返回所以它不存在的那一行。

是否使用元类或其他方法来解决这个问题?

0 投票
3 回答
947 浏览

python - Python:元类 + 包装方法 + 继承 = 问题

我在 Python 中有一个问题,我找不到任何干净的解决方案......

在调用某些方法时,我想在方法执行之前和之后执行一些代码。为了(以及许多其他事情)自动设置和清理context变量。

为了实现这一点,我声明了以下元类:

这就像一个魅力:

但是,一旦我想子类Parent化,就会出现问题,当我使用以下方法调用父方法时super

我曾考虑在将上下文设置为新值之前保存上下文,但这只能部分解决问题......

确实,(等等,这很难解释),父方法被调用,包装器被执行,但它们接收*args**kwargs寻址到Parent.test, whileself是一个Child实例,所以self如果我想用*argsand **kwargs(例如用于自动验证目的),例如:

所以基本上,为了解决这个问题,我看到了两个解决方案:

  1. 防止在调用方法时执行包装器super(Child, self)

  2. 有一个self总是“正确”类型的

这两种解决方案对我来说似乎都是不可能的......有人知道如何解决这个问题吗?一条建议 ?

0 投票
1 回答
288 浏览

python - 欺骗 Python 运算符优先级

我知道当我比较两个对象lhs == rhs并且都定义__eq__时,lhs.__eq__除非它返回NotImplemented或者rhslhs.

但是,我想实现一个类,它的实例在与任意对象进行比较时,将有机会说出他们想说的话,而arbitrary_object.__eq__不管比较语句的实现细节和位置。这听起来有点尴尬,但我正在做一个面向测试的小项目,看看testmania.expect你就会明白我需要这个做什么。

__instancecheck__我最初的想法是使用元类魔法和,使我的类成为任何其他类的子类__subclasscheck__。但在简单比较的情况下,它们根本不会被调用。

有人有什么新鲜想法吗?

0 投票
1 回答
385 浏览

delphi - 测试类引用(元类)变量中的类是否为 TMyClass

我想知道从类引用创建的对象是特定类的实例还是它的任何后代。

换句话说,我想要一个布尔表达式,例如

但是其中 var 被替换为涉及类引用变量的表达式。这听起来很容易,但让我完全难住了。

我可以创建一个实例 var := classRefVar.Create,对其进行测试,然后销毁它,但这是一个巨大的开销。

奇怪的是,编译器不会让我有

但对看似相同但无用的句法感到满意

显然,表达式

不好,因为 classRefVar 可能引用 TMyClass 的后代。

当我看到答案时,我期待着踢自己......

0 投票
3 回答
603 浏览

python - 提供不同线性代数后端的架构

我正在用 Python 制作一个新系统的原型;功能主要是数字。

一个重要的要求是能够使用不同的线性代数后端:从单个用户实现到通用库,例如​​ Numpy。线性代数实现(即后端)必须独立于接口。

我最初的架构尝试如下:

(1) 定义系统接口

(2) 实现允许独立于后端使用该接口的代码

这个简单示例的工作方式如下:Vector该类保留对后端创建的向量实例的引用(numpy.ndarray在示例中);所有算术调用都由接口实现,但它们的评估推迟到后端。

在实践中,接口重载了所有适当的运算符并推迟到后端(示例仅显示__mul__and __rmul__,但您可以遵循每个操作都会执行相同的操作)。

我愿意牺牲一些性能来换取可定制性。即使我的示例有效,但感觉不对——我会用这么多构造函数调用来破坏后端!这需要一个不同的metaclass实现,允许更好的调用延迟。

那么,你会如何建议我实现这个功能呢?我需要强调保持所有系统Vector实例同质且独立于线性代数后端的重要性。

0 投票
1 回答
1005 浏览

python - 在类似 django 的表单实现中使用元类有什么好处?

首先是一点背景......我正在查看表单的 Django 源代码,以了解 Django 中表单的实现(并在此过程中学习一些 Python)。Django 使用 DeclaredMetaFields MetaClass实现表单。

这是一个非常粗略的类 Django 表单实现的类图(链接到 gist 中的示例代码)。

ContactForm 的类 Django 表单实现 - 类图

这是一个实例图。

ContactForm 的类 Django 表单实现 - 实例图

这是同一个类的一个非常粗略的实现,而不使用元类(链接到 gist 中的示例代码)。

ContactForm 的一个简单粗暴的实现

我了解元类概念等,并了解 Django 代码是如何工作的。现在回答问题。

  1. 除了语法优雅等明显的好处之外,元类实现还有其他好处吗?
  2. 是否可以在不借助 BoundField 之类的中间对象的情况下实现类似元类的实现?