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

python - Python:元类一路向下

我有一个涉及 Python 元类的深奥问题。我正在为 Web 服务器端代码创建一个 Python 包,这将使通过客户端代理访问任意 Python 类变得容易。我的代理生成代码需要一个包含我想要包含在我的 API 中的所有 Python 类的目录。为了创建这个目录,我使用__metaclass__特殊属性在类创建过程中加入了一个钩子。具体来说,“已发布”API 中的所有类都将子类化一个特定的基类 ,PythonDirectPublic该基类本身具有一个__metaclass__已设置为记录有关类创建信息的类。

到现在为止还挺好。变得复杂的地方是我希望我PythonDirectPublic自己从第三方类(enthought.traits.api.HasTraits)继承。这个第三方类使用__metaclass__.

那么管理两个元类的正确方法是什么?我的元类应该是 Enthought 元类的子类吗?或者我应该只是在我的元类方法中调用 Enthought 的元类__new__来获取我将返回的类型对象?还是在这种特殊情况下可以使用其他一些神秘的咒语?

0 投票
5 回答
4883 浏览

delphi - Delphi 类引用...又名元类...何时使用它们

我已经阅读了官方文档,并且我了解类引用是什么,但是与替代方案相比,我看不到它们何时以及为什么是最佳解决方案。

文档中引用的示例是 TCollection,它可以用 TCollectionItem 的任何后代实例化。使用类引用的理由是它允许您调用在编译时类型未知的类方法(我假设这是 TCollection 的编译时)。我只是没有看到使用 TCollectionItemClass 作为参数如何优于使用 TCollectionItem。TCollection 仍然能够保存 TCollectionItem 的任何后代,并且仍然能够调用在 TCollectionItem 中声明的任何方法。不会吗?

将此与通用集合进行比较。TObjectList 似乎提供了与 TCollection 大致相同的功能,并增加了类型安全的好处。您无需从 TCollectionItem 继承以存储您的对象类型,并且您可以根据需要将集合设为特定类型。如果您需要从集合中访问项目的成员,您可以使用通用约束。除了 Delphi 2009 之前的程序员可以使用类引用这一事实之外,还有其他令人信服的理由在通用容器上使用它们吗?

文档中给出的另一个示例是将类引用传递给充当对象工厂的函数。在这种情况下,一个用于创建 TControl 类型对象的工厂。它不是很明显,但我假设 TControl 工厂正在调用传递给它的后代类型的构造函数,而不是 TControl 的构造函数。如果是这种情况,那么我开始看到至少有一些使用类引用的理由。

所以我想我真正想了解的是何时何地类引用最合适,他们为开发人员了什么?

0 投票
1 回答
1963 浏览

python - 何时在 Python 中内联元类的定义?

今天我在这里遇到了 Python 中元类的一个令人惊讶的定义,元类定义有效地内联。相关部分是

什么时候使用这样的内联定义才有意义?

进一步的论点:

一种说法是创建的元类不能在其他地方使用这种技术重用。一个反驳的论点是,使用元类的一个常见模式是定义一个元类并在一个类中使用它,然后继承该类。例如,在保守的元类中,定义

可以写成

还有其他考虑吗?

0 投票
2 回答
5065 浏览

python - 参数化类和元类有什么区别(请使用 Python 中的代码示例)?

你好 Stack Overflow 贡献者,

我是一个正在学习 Python 的新手程序员,我偶然发现了这个有助于解释面向对象范例的网站。我知道元类是类的类(比如元目录是目录的目录等等),但我遇到了一些问题:元类和参数化类之间的实际区别是什么,根据网站的定义?

如果可以,请在 Python 中包含说明两者之间差异的代码示例。感谢您的帮助!

0 投票
1 回答
1975 浏览

python - 使用 SQL Alchemy 声明性基础处理元类冲突

我有一个class X派生自具有自己的元类的类Meta。我还想从 SQL Alchemy 中的声明性库派生 X。但我做不到简单的

因为我会得到元类冲突错误:'派生类的元类必须是其所有基类的元类的(非严格)子类'。我知道我需要创建一个新的元类,该元类将派生自 Meta 和声明性基础使用的任何元类(我认为是 DeclarativeMeta?)。这样写就够了吗:

我试过这个,它似乎工作;但恐怕我可能在这段代码中引入了一些问题。

我读了手册,但对我来说有点太神秘了。什么是

编辑:

我的课程使用的代码如下:

0 投票
3 回答
1419 浏览

python-3.x - python:操作类的__dict__

(全部在 ActivePython 3.1.2 中)

我试图更改类(而不是实例)属性。元__dict__类的 似乎是完美的解决方案。但是当我尝试修改时,我得到了:

TypeError:“dict_proxy”对象不支持项目分配

为什么,我能做些什么呢?

编辑

我在类定义中添加属性。

setattr不起作用,因为该类尚未构建,因此我还不能引用它(或者至少我不知道如何)。

传统分配不起作用,因为我要添加大量属性,其名称由特定规则确定(因此我不能只输入它们)。

换句话说,假设我class AA.a001通过A.a999; 并且必须在完全构建之前定义所有这些(因为否则 SQLAlchemy 将无法正确检测它)。

另请注意,我在原标题__dict__中打错了字:我想修改的是普通类,而不是元类。

0 投票
1 回答
530 浏览

python - python:元类中__new__的时间安排

以下代码无法编译;它说

NameError:名称“字段”未定义

在最后一行。是因为直到分配__new__完成后才调用?fields我应该怎么办?

编辑:

我发现这不是时间问题;这是名称隐藏的问题。如果我改写,效果很好A.fields

我想知道为什么我不能使用fieldsor super().fields

0 投票
4 回答
181 浏览

python - Python : how to prevent a class variable that is a function to be understood as a method?

I am currently implementing a django app, for this I try to use a syntax that is consistent with Django's...

So here is what I am trying :

sort_key is a key function (for sorting purposes), but of course, it is understood as Meta's method (which is absolutely not what I want)!!!

Any workaround to this, that would still allow me to use this syntax ?

EDIT : Just an important precision ... the code I wrote is supposed to be written by somebody that uses the library ! That's why I don't want any dirty trick. And YES in Django it is really used just for options... of course Meta IS a class, but I say "it is not seen as a class", because it is not used as a class : you don't instantiate it, you don't put class methods, only class attributes... The Model has a metaclass that extracts everything from this Meta and handles all the options declared... But that's all ! It IS just a placeholder for options.

But OK that's True I never saw an option that is a function in Django... So I'll follow Ned an declare this sorting function as a method of Model that has to be overriden ...

0 投票
2 回答
811 浏览

python - 有没有办法在 Python 2.5 中模拟 Python 3 元类的 __prepare__ 特殊方法?

在我的项目中,我必须坚持使用 Python 2.5(Google App Engine)。在应用程序的某个地方(实际上是一个框架),我必须跟踪定义了哪些变量以及定义它们的顺序,换句话说,我想在处理赋值运算符时进行拦截。

使用 Python 3,我将定义一个元类 M,其__prepare__方法返回一个智能字典,该字典跟踪它何时被访问。然后我只需要使用元类 M 执行类语句中的所有内容。

有没有办法在 Python 2.5 中模拟这个?

我想实现的示例

使用 Python 3 的元类方法,我可以实现像引用一样工作的变量,例如 M 可以这样

将与 等价(直到创建 C)y(1),即黑盒ref函数对 C 字典中变量的第一次赋值会创建此变量。进一步的赋值只是调用 ref 函数的参数。

0 投票
2 回答
1359 浏览

c++ - 用于参数化继承的元类

我已经阅读了一些关于 Python 元类的教程。我以前从未使用过,但我需要一个相对简单的东西,而且所有教程似乎都针对更复杂的用例。我基本上想创建一个模板类,它具有一些预先指定的主体,但将其基类作为参数。因为我是从 C++/D 模板中得到这个想法的,所以这里有一个我想编写的代码在 C++ 中的示例: