问题标签 [method-resolution-order]

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 回答
111 浏览

python - 在模块中定义之前使用的属性

这是代码:

然后,我像这样运行它: $ python a.py NameError: name 'bar' is not defined

错误意味着,在执行bar时未定义。但是为什么解释器在模块中ALL_FUNC = [bar, foo]找不到函数呢?bar仅仅因为bar是在ALL_FUNC?

看这个,这是一个python类,

显然,上面的代码会运行没有任何错误,但是barinA也是在访问它的位置(in __init__)之后定义的,为什么self.bar()可以找到没有任何错误?

跟进

这是另一个模块,

然后像这样运行,

没有错误!为什么?bar应该会导致错误,不是吗?就因为没有在 中使用__main__,所以没有检测到错误?但是bar的定义被执行了,对吧?

0 投票
4 回答
430 浏览

c++ - C++ 中的函数:在使用之前定义它

在 C/C++ 中,当且仅当被调用者函数对调用者可见时,调用者函数才能调用被调用者函数,这意味着被调用者的定义应该在使用它之前完成,否则使用前向声明。

这是我的问题,

上面的代码可以正常工作。但是foo调用bar并且我没有在bar' 之前foo或 forward-declare之前放置定义bar,调用barin怎么会foo起作用?编译器怎么能找到bar

0 投票
1 回答
18858 浏览

python - mixin 的顺序如何影响派生类?

说,我有以下通过触摸相互重叠的混合dispatch()

如果我希望我的视图通过订单,请检查 A -> 检查 B,我的代码应该是MyView(FooMixin, BarMixin, View)还是MyView(BarMixin, FooMixin, View)

为什么我们总是把View它或其子类放在 mixins 之后?(我从阅读 django 通用视图的源代码中注意到了这一点,但我不知道它背后的基本原理,如果有的话)

0 投票
3 回答
5711 浏览

python - 如何在不出现 MRO 错误的情况下动态添加 mixin 作为基类?

假设我有一堂课AB并且C

ClassAB都是 Class 的 mixin 类C

这在实例化 C 类时不起作用。我必须object从 C 类中删除才能使其工作。(否则你会遇到 MRO 问题)。

TypeError:调用元类基础时出错
无法
为基础 B、对象、A 创建一致的方法解析顺序 (MRO)

但是,我的情况有点复杂。在我的例子中,类C是一个服务器,其中A并且B将是在启动时加载的插件。这些都驻留在自己的文件夹中。

我还有一个名为Cfactory. 在 Cfactory 中,我有一个__new__方法可以创建一个功能齐全的对象 C。在该__new__方法中,我搜索插件,使用 加载它们__import__,然后将它们分配给C.__bases__ += (loadedClassTypeGoesHere, )

所以以下是一种可能性:(使其非常抽象)

这再次不起作用,并且会再次出现 MRO 错误:

TypeError:无法
为基础对象 A 创建一致的方法解析顺序 (MRO)

一个简单的解决方法是objectA和中删除基类B。然而,这将使它们成为旧式对象,当这些插件独立运行时应该避免使用这些对象(这应该是可能的,UnitTest 明智的)

另一个简单的解决方法是从中删除objectC但这也会使其成为旧式类并且C.__bases__将不可用,因此我无法将额外的对象添加到C

什么是一个好的架构解决方案,你将如何做这样的事情?现在我可以忍受插件本身的旧式类。但我宁愿不使用它们。

0 投票
3 回答
125 浏览

c# - 抽象类中的“this”类型和重载方法解析顺序混淆

这个非常简单的例子让我感到困惑:

这个的输出是

直到'Got A'之前的一切都很好。我希望当我在 class 的实例上X.XMethod(B)调用方法时会调用该方法。MB

这里发生了什么?当很明显提供的参数类型是而不是时,为什么会XMethod(A)调用而不是调用?XMethod(B)BA

PS:对于等效实现,我在 java 中得到了相同的输出。

0 投票
1 回答
1501 浏览

python - 方法解析顺序错误

这更像是一个好奇的问题,而不是一个严肃的问题:

我正在玩多重继承并遇到了这个问题:

我得到一个TypeError. 但是,当我颠倒多重继承的顺序时:

它工作正常。我假设在第一个例子中,objectbefore的继承A会产生某种名称歧义。有人愿意解释这里发生了什么吗?

0 投票
3 回答
362 浏览

python - 如何在python中跟踪方法执行

我正在尝试从一些开源 python 项目中读取一些源代码,比如 ipython。我经常发现很难跟踪不同类中方法的执行流程,即使使用 eclipse 的调试工具并逐步执行代码。我不太清楚为什么代码会跳转到远相关类中的某些方法。

我知道它必须是继承层次结构,但我发现很难遵循。是否有任何工具可以帮助理解代码的执行方式?喜欢可视化不同方法的执行顺序?希望这不是一个完全幼稚的问题。

谢谢。

0 投票
4 回答
1197 浏览

ruby - 合并两个 Ruby 模块但不包含

我想在不破坏查找链的情况下合并两个 Ruby 模块。基本上我希望的行为BothAnB就像我连接来自 A 和 B 的文本源代码并且新的 foo 替换旧的一样。当 MRO 线性化继承菱形时会出现问题。

A 和 B 是相当复杂的模块,可以具有深度继承链(这是针对允许程序员这样做的元编程框架)。

Include B, A不起作用,因为不是查找 BothAnB->B->A->O,而是我需要它是 BothAnB->B->O(和可选的 ->A)。我已经接近了:

  • 深度克隆 A 的整个继承树(去除菱形)
  • undef_method在 A 的克隆上删除在 B 中找到的方法
  • 制作一种新方法Module来反映这种行为

还有比这更好的解决方案吗?理想情况下,我希望在调用BothAnB.ancestors.

[注意:在根据 Phrogz 的反馈得到两个答案后,我完全改变了问题,所以如果它们看起来无关紧要,那就是]

0 投票
1 回答
879 浏览

python-3.x - python3 super 不适用于 PyQt 类

python3中有一个简单的程序:

a) 当 Foo 类从 QtCore.QObject 和 Bar 继承时,我们得到:

b) 当 Foo 类从 FakeQObject 和 Bar 继承时,我们得到:

问题是:为什么在 a) 的情况下,不调用 Bar init?

我在这里发现了类似的问题pyQt4 和继承,但没有好的答案。

提前致谢!

0 投票
2 回答
702 浏览

python - 在 Python 中使用多重继承强制执行特定的 __init__

我试图让__init__执行顺序正确。层次结构由两个分支组成。左分支实现了右分支的一些抽象方法。在右分支也有一个分裂。现在我希望他们执行:首先从左上到下,然后从右上到下。

有没有办法在 Python 3 中实现这一点?

所以基本上以下应该按顺序打印数字(它没有):

不幸的是,我无法更改 L2 和 R2 的顺序,因为 L2 实现了 R2 的抽象方法(如果我更改它会出现错误)。

可能吗?

(您知道如何考虑 MRO 以轻松解决此类问题吗?)

编辑:我认为我没关系,但我想指出,在我的真实结构中,L 侧实际上有一颗钻石,如 L2a(L1)、L2b(L1) 和 L2(L1a、L2a)。那就是完全拆分一些功能。