問題タブ [super]
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.
java - Java型引数では、厳密にサブタイプのみを意味しますか? またはEでも十分でしょうか?
Java型引数では、厳密にサブタイプのみを意味しますか? またはEでも十分でしょうか?
ruby - 祖父母のメソッドを呼び出して、ルビーで親をスキップするにはどうすればよいですか?
継承チェーンで特定のメソッド呼び出しを選択するにはどうすればよいですか?
したがって、出力はA:Boo、C:Booになります。
TIA、
-ダニエル
python - Djangoform.saveステップバイステップ
2つの別々のビュー関数(add / edit:)からトリガーされた製品を追加/編集するためのフォーム(フィールド'user'はユーザーの外部キー)があるとします。
フォームのsaveメソッドは次のようになります。
誰かがこのsaveメソッドで何が起こっているのかを段階的に教えてもらえますか?このフォームでsuperを呼び出すのはなぜですか?関数呼び出しが同じ場合、新製品を編集して保存するときの処理全体の違いは何ですか?
python - Python: `super` の引数の順序をどのように覚えていますか?
super
タイトルが示すように、の引数の順序をどのように覚えていますか? 私が見逃したニーモニックはありますか?
何年ものPythonプログラミングの後、私はまだ調べなければなりません:(
(記録のために、それはですsuper(Type, self)
)
java - スーパー キーワードに関する混乱。Java で実装された Decorator パターン
上記の説明はとてもいいです。
ただし、以下に示すように、Decorator Pattern (DeP) の実装には少し混乱しています。
上記のリンクされたコードのデザインは、tinypic.com/view.php?pic=xnaqlt&s=3 で提供されています。
「super.callTrailer();」で混乱しています。デコレータ クラス Header1、Header2、Footer1、および Footer2 で、すべて TicketDecorator から派生します。
「callTrailer();」だけでいいじゃないですか。? 各デコレーター オブジェクトは、「private Component myTrailer;」という行により、次のデコレーターへの独自の参照を持つことになります。
注: 私は Java に精通しておらず、デザイン パターンの初心者です。
python - (Python)予期しないときに作成されたクロージャ
ネストされたクラスを作成するときに予期しないクロージャが発生しました。これはメタクラス、スーパー、またはその両方に関連するものだと思います。これは、クロージャがどのように作成されるかに間違いなく関係しています。私はpython2.7を使用しています。
これが私が見ているのと同じ問題を示す5つの単純化された例です(それらはすべて最初のものから構築されます):
例1:
例2:
例3:
例4:
例5:
これが私が理解していることです(例を参照):
- メタクラスは継承されるため、のメタクラス
Subclass
を取得しBase
ます。 - 影響を受けるのは影響を受けるだけ
__init__
で、Subclass.other
メソッドは影響を受けません(#1)。 - 削除
Subclass.other
しても違いはありません(#1)。 self.name=name
から削除しSubclass.__init__
ても違いはありません(#1)。- クロージャセル内のオブジェクトは関数ではありません。
- オブジェクトは
Metaclass
またはではありませんが、 (#1)と同じようBase
に、タイプのオブジェクトがあります。Metaclass
Base
- オブジェクトは、実際にはネストされたタイプ
Subclass
(#1)のオブジェクトです。 - とのクロージャーセルは
t1.subclass.__init__
、t1.subclass2.__init__
2つの異なるクラス(#1)からのものですが、同じです。 Subclass
(#1)の作成をネストしない場合、クロージャーは作成されません。- 電話をかけないと
super(...).__init__
、Subclass.init__
クロージャーは作成されません(#2)。 - noを割り当て
__metaclass__
てから継承するとobject
、同じ動作が表示されます(#3)。 - のクロージャセルのオブジェクト
t3.other.__init__
はt3.other
(#3)です。 - メタクラスに
__init__
(#4)がない場合も、同じ動作が発生します。 Base
がない場合__init__
(#4)も同じ動作が発生します。- 例4の3つのサブクラスのクロージャーセルはすべて異なり、それぞれが対応するクラス(#4)と一致します。
- をに
super(...).__init__
置き換えるとBase.__init__(self)
、クロージャーが消えます(#5)。
これが私が理解していないことです:
- なぜクロージャーが設定されるの
__init__
ですか? - なぜクロージャーが他のクロージャーに設定されないのですか?
- クロージャーセル内のオブジェクトが、
__init__
属するクラスに設定されているのはなぜですか? super(...).__init__
が呼び出されたときにのみこれが発生するのはなぜですか?Base.__init__(self)
が呼び出されたときになぜこれが起こらないのですか?- これは実際にはメタクラスの使用とはまったく関係がありますか(おそらく、デフォルトのメタクラスは
type
)ですか?
助けてくれてありがとう!
-エリック
(更新)これが私がその時見つけたものです(ジェイソンの洞察に基づいて):
まず、関数の名前はそれ自体の本体内のスコープ内にあります。次に、関数は、それらの関数を参照する場合、それらが定義されている関数のクロージャを取得します。
関数名がそのようなスコープにあることに気づいていませんでした。同じことがクラスにも当てはまります。クラスが関数のスコープ内で定義されている場合、クラスのメソッド内でそのクラス名を参照すると、次のように、クラスはそのメソッドの関数のクロージャにバインドされます。
ただし、非関数に対してクロージャを作成できないため、以下は失敗します。
良いもの!
java - スーパークラス内からサブクラスの名前を取得する
という名前の基本クラスがあるとしましょうEntity
。そのクラスには、クラス名を取得するための静的メソッドがあります。
今、私はそれを拡張する別のクラスを持っています。
Userのクラス名を取得したい:
私の目標は、コンソールに「com.packagename.User」の出力を表示することですが、Entityクラスは静的メソッドから直接参照されているため、代わりに「com.packagename.Entity」になります。
これが静的メソッドでない場合は、クラスthis
内のキーワード(つまり、:)を使用することで簡単に解決できます。ただし、このメソッドを静的に保つ必要があります。これにアプローチする方法について何か提案はありますか?Entity
return this.class.getClass()
python - サブクラス化を介してnamedtupleのコンストラクター引数を変更しますか?
namedtuple
短いビットフィールドで個々のフラグを表すを作成したいと思います。タプルが作成される前にビットフィールドをアンパックできるように、サブクラス化しようとしています。しかし、私の現在の試みは機能していません:
現在、私の経験super()
は限られており、私の経験__new__
は事実上存在しないので、(私にとって)謎めいたエラーをどうすればよいのかよくわかりませんTypeError: super.__new__(Status): Status is not a subtype of super
。グーグルでドキュメントを掘り下げても、啓蒙的なものは何も得られていません。
ヘルプ?
java - Javaのsuper()
super()
親コンストラクターを呼び出すために使用されますか?説明してくださいsuper()
。
python - 変数スーパークラス メソッドの呼び出し
可変メソッド名を使用してスーパークラスのメソッドを呼び出そうとしています。通常、次の 2 行のコードは同等のものとして表示されます。
実際、これは最初の行を使用したときに実際に起こることでもあると私は信じています。ただし、次の例では、2 行目で奇妙な問題が発生します。
super
スーパー オブジェクトを構築し、スーパー クラスのメソッドを呼び出すために使用します。直接実行すると期待どおりに機能し__getattribute__
ますが、最初にメソッドを取得するために使用すると、サブクラスのメソッドを何度も呼び出す無限ループが発生します。
次のコードを参照してください。
そのコードを実行すると、すべてが期待どおりに機能し、次のような出力が得られるはずです。
したがって、直接アクセスする方法と を介する方法の両方の方法は__getattribute__
同じように見えます。ただし、メソッド呼び出しをコメントアウトされた行に置き換えると、再帰ランタイム エラーが発生します。
なぜこれが起こるのか、さらに重要なことに、作業ラインを使用するときに、Python が内部的に行うのと同じ方法で実際にメソッドにアクセスするにはどうすればよいでしょうか?
編集
すでにすべてを試したと思ったとき、これが機能していることがわかりました:
実際には に等しくなりsuper( B, self ).example
ます。