问题标签 [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 回答
5464 浏览

python - 如何使用元类添加方法

如何使用元类向类添加实例方法(是的,我确实需要使用元类)?以下类型的作品,但 func_name 仍将是“foo”:

我的问题是一些库代码实际上使用了 func_name 并且后来找不到 Foo 实例的 'bar' 方法。我可以做:

还有 types.MethodType,但我需要一个尚不存在的实例来使用它。我在这里错过了什么吗?

0 投票
5 回答
2834 浏览

python - 使用一种方法的文档字符串自动覆盖另一种方法的文档字符串

问题:我有一个类,其中包含一个execute调用另一个方法的模板方法_execute。子类应该被覆盖_execute以实现某些特定功能。此功能应记录在_execute. 高级用户可以创建自己的子类来扩展库。但是,处理此类子类的另一个用户应该只使用execute,因此如果他使用 ,他将看不到正确的文档字符串help(execute)

因此,最好修改基类,使子类中的文档字符串execute自动替换为_execute. 任何想法如何做到这一点?

我正在考虑使用元类来做到这一点,以使其对用户完全透明。

0 投票
24 回答
981000 浏览

python - Python 中的元类是什么?

在 Python 中,什么是元类,我们用它们做什么?

0 投票
2 回答
1103 浏览

python - 如何在 GAE 中覆盖 HTTP 请求动词

在 Google App Engine Webapp 框架应用程序的上下文中:

我想在提供参数_method的情况下更改请求的请求动词,例如,如果POST请求带有参数_method=PUT,我需要更改请求以调用处理程序的put方法。这是为了应对prototype.js 处理PUT 和DELETE 等动词的方式(IE 的解决方法)。这是我的第一次尝试:

问题是,由于某种原因,每当重定向完成时,self.request.params 在调用处理方法(放置或删除)时被清空,即使它们在调用初始化时被填充。任何人都知道这是为什么?作为一种解决方法,我认为我可以在 initialize() 时间克隆参数,但是 .copy() 不起作用,我也没有找到一种方法来做到这一点。

更新:我收到了来自 Arachnid 的非常有用的回复。我最终得到的解决方案使用了元类。它在下面找到。

0 投票
21 回答
31888 浏览

python - 元类有哪些(具体)用例?

我有一个朋友喜欢使用元类,并定期提供它们作为解决方案。

我认为您几乎不需要使用元类。为什么?因为我认为如果你对一个类做这样的事情,你可能应该对一个对象做这样的事情。一个小的重新设计/重构是有序的。

能够使用元类导致很多地方的很多人将类用作某种二流对象,这对我来说似乎是灾难性的。编程会被元编程取代吗?不幸的是,类装饰器的添加使它更容易被接受。

所以,我很想知道你在 Python 中元类的有效(具体)用例。或者了解为什么变异类有时比变异对象更好。

我将开始:

有时在使用第三方库时,能够以某种方式改变类是很有用的。

(这是我能想到的唯一案例,并不具体)

0 投票
2 回答
29946 浏览

python - “MetaClass”、“__new__”、“cls”和“super”——具体的机制是什么?

我读过这样的帖子:

  1. Python 中的元类是什么?
  2. Python 中元类的(具体)用例是什么?
  3. Python 的 Super 很漂亮,但你不能用

但不知何故,我感到困惑。许多困惑,例如:

我何时以及为什么必须执行以下操作?

或者

或者

super 究竟是如何工作的?

什么是链接 1 中的类注册和取消注册,它是如何工作的?(我认为这与singleton有关。我可能是错的,来自 C 背景。我的编码风格仍然是函数式和 OO 的混合体)。

类实例化(子类、元类、超类、类型)和方法调用(

) 带有注释良好的工作代码(虽然第一个链接非常接近,但它没有谈论 cls 关键字和 super(..) 和注册表)。最好是具有多重继承的示例。

PS:我将最后一部分作为代码制作,因为堆栈溢出格式正在将文本转换metaclass->__new__ 为元类->

0 投票
5 回答
1932 浏览

python - 有人在 Python/其他语言中使用元元类/元元类吗?

我最近在 python 中发现了元类。

基本上,python中的元类是一个创建类的类。您想要这样做的原因有很多——例如任何类型的类初始化。在工厂上注册类、复杂的属性验证、改变继承的工作方式等等。所有这些不仅变得可能而且变得简单。

但在 python 中,元类也是普通类。所以,我开始想知道抽象是否可以有用地更高,在我看来它可以而且:

  • 元类对应或实现模式中的角色(如在 GOF 模式语言中)。
  • 元元类就是模式本身(如果我们允许它创建代表抽象角色的类元组,而不仅仅是一个类)
  • meta-meta-metaclass 是一个模式工厂,它对应于 GOF 模式分组,例如 Creational、Structural、Behavioural。一个工厂,您可以在其中描述某种类型的问题的案例,它会为您提供一组解决它的类。
  • 一个 meta-meta-meta-metaclass (据我所知),是一个模式工厂 factory,一个你可以描述问题类型的工厂,它会给你一个模式工厂来询问。

我在网上找到了一些关于这个的东西,但大多不是很有用。一个问题是不同的语言对元类的定义略有不同。

有没有其他人在 python/其他地方使用过这样的元类,或者在野外看到过这个,或者考虑过它?其他语言的类似物是什么?例如,在 C++ 中,模板递归能走多远?

我非常想进一步研究它。

0 投票
1 回答
1506 浏览

interface - Groovy:为接口委托元类?

使用 Groovy 的包名称约定,我可以像这样拦截对 Java 方法的 Groovy 方法调用:

如果我真的创建了一个 Foo 类的对象,这很好用:

但是,如果 Foo 是一个接口,并且我想拦截对它的任何实现的方法调用怎么办?

有没有办法实现这一点,而无需为接口的每个已知实现使用 DelegatingMetaClass?

0 投票
1 回答
1554 浏览

groovy - 如何从 Groovy 中的 MetaClass 方法引用 GroovyObject 实例?

这是我想要做的一个人为的例子,但最低限度地表达了所需的行为。我想引用正在调用属性访问的对象的实例。我首先尝试了“this”,但它指的是封闭类,而不是 MetaClass 或 String 实例。

0 投票
2 回答
579 浏览

c# - UML 2 Profiles 包:如何扩展操作?

我在 uml 配置文件实现方面遇到了很大的麻烦。问题是我不知道如何使用 Profile 从 Infrastructure::Core::Constructs 扩展 uml Operation 类?

根据 uml 元模型,来自 Profiles 包的扩展关联仅允许元类属于 Core::Constructs::Class 类型。

操作是元类吗?如果是这样,我怎么能把它作为 Core::Consructs::Class 呢?据我所见,没有一个 uml 元模型 Operation 确实专门或实现了 Core::Constructs::Class。

请帮我。

我正在尝试使用 C# 中的第三方 uml 2.* 元模型实现在 C# 中实现我的 uml 配置文件。