问题标签 [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.
python - 在模块中定义之前使用的属性
这是代码:
然后,我像这样运行它: $ python a.py NameError: name 'bar' is not defined
错误意味着,在执行bar
时未定义。但是为什么解释器在模块中ALL_FUNC = [bar, foo]
找不到函数呢?bar
仅仅因为bar
是在ALL_FUNC
?
看这个,这是一个python类,
显然,上面的代码会运行没有任何错误,但是bar
inA
也是在访问它的位置(in __init__
)之后定义的,为什么self.bar()
可以找到没有任何错误?
跟进
这是另一个模块,
然后像这样运行,
没有错误!为什么?bar
应该会导致错误,不是吗?就因为没有在 中使用__main__
,所以没有检测到错误?但是bar
的定义被执行了,对吧?
c++ - C++ 中的函数:在使用之前定义它
在 C/C++ 中,当且仅当被调用者函数对调用者可见时,调用者函数才能调用被调用者函数,这意味着被调用者的定义应该在使用它之前完成,否则使用前向声明。
这是我的问题,
上面的代码可以正常工作。但是foo
调用bar
并且我没有在bar
' 之前foo
或 forward-declare之前放置定义bar
,调用bar
in怎么会foo
起作用?编译器怎么能找到bar
?
python - mixin 的顺序如何影响派生类?
说,我有以下通过触摸相互重叠的混合dispatch()
:
如果我希望我的视图通过订单,请检查 A -> 检查 B,我的代码应该是MyView(FooMixin, BarMixin, View)
还是MyView(BarMixin, FooMixin, View)
?
为什么我们总是把View
它或其子类放在 mixins 之后?(我从阅读 django 通用视图的源代码中注意到了这一点,但我不知道它背后的基本原理,如果有的话)
python - 如何在不出现 MRO 错误的情况下动态添加 mixin 作为基类?
假设我有一堂课A
,B
并且C
。
ClassA
和B
都是 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)
一个简单的解决方法是object
从A
和中删除基类B
。然而,这将使它们成为旧式对象,当这些插件独立运行时应该避免使用这些对象(这应该是可能的,UnitTest 明智的)
另一个简单的解决方法是从中删除object
,C
但这也会使其成为旧式类并且C.__bases__
将不可用,因此我无法将额外的对象添加到C
什么是一个好的架构解决方案,你将如何做这样的事情?现在我可以忍受插件本身的旧式类。但我宁愿不使用它们。
c# - 抽象类中的“this”类型和重载方法解析顺序混淆
这个非常简单的例子让我感到困惑:
这个的输出是
直到'Got A'之前的一切都很好。我希望当我在 class 的实例上X.XMethod(B)
调用方法时会调用该方法。M
B
这里发生了什么?当很明显提供的参数类型是而不是时,为什么会XMethod(A)
调用而不是调用?XMethod(B)
B
A
PS:对于等效实现,我在 java 中得到了相同的输出。
python - 方法解析顺序错误
这更像是一个好奇的问题,而不是一个严肃的问题:
我正在玩多重继承并遇到了这个问题:
我得到一个TypeError
. 但是,当我颠倒多重继承的顺序时:
它工作正常。我假设在第一个例子中,object
before的继承A
会产生某种名称歧义。有人愿意解释这里发生了什么吗?
python - 如何在python中跟踪方法执行
我正在尝试从一些开源 python 项目中读取一些源代码,比如 ipython。我经常发现很难跟踪不同类中方法的执行流程,即使使用 eclipse 的调试工具并逐步执行代码。我不太清楚为什么代码会跳转到远相关类中的某些方法。
我知道它必须是继承层次结构,但我发现很难遵循。是否有任何工具可以帮助理解代码的执行方式?喜欢可视化不同方法的执行顺序?希望这不是一个完全幼稚的问题。
谢谢。
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 的反馈得到两个答案后,我完全改变了问题,所以如果它们看起来无关紧要,那就是]
python-3.x - python3 super 不适用于 PyQt 类
python3中有一个简单的程序:
a) 当 Foo 类从 QtCore.QObject 和 Bar 继承时,我们得到:
b) 当 Foo 类从 FakeQObject 和 Bar 继承时,我们得到:
问题是:为什么在 a) 的情况下,不调用 Bar init?
我在这里发现了类似的问题pyQt4 和继承,但没有好的答案。
提前致谢!
python - 在 Python 中使用多重继承强制执行特定的 __init__
我试图让__init__
执行顺序正确。层次结构由两个分支组成。左分支实现了右分支的一些抽象方法。在右分支也有一个分裂。现在我希望他们执行:首先从左上到下,然后从右上到下。
有没有办法在 Python 3 中实现这一点?
所以基本上以下应该按顺序打印数字(它没有):
不幸的是,我无法更改 L2 和 R2 的顺序,因为 L2 实现了 R2 的抽象方法(如果我更改它会出现错误)。
可能吗?
(您知道如何考虑 MRO 以轻松解决此类问题吗?)
编辑:我认为我没关系,但我想指出,在我的真实结构中,L 侧实际上有一颗钻石,如 L2a(L1)、L2b(L1) 和 L2(L1a、L2a)。那就是完全拆分一些功能。