問題タブ [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 - 新しいスタイルのクラスのメソッド解決順序 (MRO) ?
本Python in a Nutshell (2nd Edition)には、
古いスタイルのクラスを使用して、メソッドが従来の解決順序で解決される方法
と、新しい順序でどのように異なるかを示す例があります。
同じ例を新しいスタイルで書き直して試してみましたが、結果は古いスタイルのクラスで得られたものと変わりません。この例を実行するために使用している Python のバージョンは2.5.2 です。以下に例を示します。
呼び出しinstance.amethod()
は. Base1
_ Base3
呼び出しは次のようDerived.__mro__
に表示されます。
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
新しいスタイル クラスを使用した MRO の理解が間違っているのか、それとも私が検出できないばかげた間違いを犯しているのか、私にはわかりません。MROをよりよく理解するのを手伝ってください。
python - 「mro()」は何をしますか?
でdjango.utils.functional.py
:
わかりませんmro()
。それは何をし、「mro」はどういう意味ですか?
python - 親クラス初期化子を暗黙的に呼び出す
上記のコードでは、コメントアウトされた__init__
呼び出しは、スーパークラスの初期化を行うための一般的に受け入れられている「スマート」な方法のようです。ただし、クラス階層が変更される可能性がある場合は、最近までコメントなしのフォームを使用していました。
B
上記の階層でのスーパーコンストラクターの呼び出しでは、これB.__init__
が再度呼び出されますが、self.__class__
実際には、私がいつも想定していたものC
ではないようです。B
B
Python-2.xで、現在のクラス( in in )に名前を付けずにスーパーコンストラクターを呼び出すときに、(すべての親クラスを正しい順序で初期化することに関して)適切なMROを維持できる方法はありsuper(B, self).__init__(1, b, c)
ますか?
c++ - C++ でのメソッド解決順序
次のクラス階層を検討してください。
- 仮想メソッド foo() を持つ基本クラス オブジェクト
- 複数の継承 (仮想および非仮想) を持つ任意の階層。各クラスは Object のサブタイプです。それらのいくつかは foo() をオーバーライドし、いくつかはオーバーライドしません
- foo() をオーバーライドしない、この階層のクラス X
C++ のクラス X のオブジェクトで foo() の呼び出し時に実行されるメソッドを決定する方法は?
(特定のケースではなく、アルゴリズムを探しています。)
python - Pythonでのクラスの前方宣言
次のプログラムは正常に実行できます。
Simple
、、の定義Composite
を__main__
3つの異なるファイルに保持したいのですが、にインポートできず、にSimple
インポートできないため、それを行うことができません。composite.py
Composite
simple.py
別々のファイルを保持できるように、クラス定義をどのように変更しますか?
ありがとうございました。
PS。「前方宣言」に関連するいくつかの回答を読みましたが、特定の問題に対する回答が見つかりませんでした。
c# - 基本タイプによるメソッド解決
私の状況はこれです:
では、呼び出すときにどのメソッドが呼び出されますInheritedClassInstance.SomeMethod
か?InheritedClassInstance.AnotherMethod
それは、、またはBaseClassを呼び出しますAnotherMethod
か?
perl - このスキームで「C3 マージ中に階層が矛盾しています」というエラーが発生するのはなぜですか?
そして、何かあるとすれば、私はそれについて何ができますか?
さて、私はそれが
Win32
から継承されていることを理解していますUnix
が、ディスパッチは.Win32 -> Unix
Unix
また、クラス名を渡すだけなので、継承は大きな問題ではないことも理解してい
File::Spec::x
ますが、このように調整するクラスが実際に必要な場合はどうなるのだろうかと考えなければなりません。
python - MyClass.__class__ が MyClass().__class__ とは異なる値を返すのはなぜですか?
「person.Person.」と呼べるようにしたいです。class ' を呼び出して、'class person.Person' を返します。これは、person オブジェクトの場合と同様です。
これが Person 継承ツリーです...
何が起きてる?
django - django add_to_class()でモデルの継承/MROが正しく機能しない
add_to_class() を介してフィールドを追加するときに、モデルの継承に問題があります。私はモデルを持っていますFile(models.Model)
-Image(File)
これらは django-filer から来ています。
私のアプリでは、それらをインポートしてフィールドとメソッドを追加しています:
イメージはそれらの両方を継承する必要がありますが、フィールドではなくメソッドのみを取得します。
どんな手掛かり?
python - Python 3 の組み込み型 __init__ は super().__init__ を呼び出しませんか?
組み込み型および他のクラスから派生する場合、組み込み型のコンストラクターがスーパークラス コンストラクターを呼び出していないようです。これにより、MRO のビルトインの後にある型に対して __init__ メソッドが呼び出されなくなります。
例:
このサンプルでは、 A.__init__ は呼び出されません。代わりにB が定義されている場合class B(A, list)
(継承順序を切り替える場合)、意図したとおりに動作します (つまり、 A.__init__ が呼び出されます)。
継承順序へのこの非常に微妙な依存は、かなり非 Pythonic のように見えますが、このように意図されていますか? また、複雑なクラス階層の組み込み型から派生させてはならないということも意味します。なぜなら、他の誰かがクラスから派生したときに組み込み型が MRO のどこに行き着くのかを知ることができないからです (メンテナンスの恐怖)。何か不足していますか?
追加情報: Python バージョン 3.1