問題タブ [abc]
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の組み込み型の仮想サブクラスにすることは可能ですか? クラスを のサブクラスと見なしたいのですがint
、次のように直接継承したくありません。
それ以来、私が望むかどうかにかかわらず、私のクラスは事実上不変になります。たとえば、__iadd__
andのようなメソッドを使用できなくなるため、それ自体を変更する方法がありません__isub__
。int
から継承することもできnumbers.Integral
ますが、誰かが呼び出すとisinstance(myIntObj, int)
、issubclass(MyInt, int)
答えは になりますFalse
。ABCMeta のメタクラスを持つクラスは、このメソッドregister
を使用してクラスを実際には継承しない仮想ベースクラスとして登録できることを理解しています。組み込み型でこれを行う方法はありますか? 何かのようなもの:
私は(Pythonのドキュメントと一般的にオンラインの両方で)見回しましたが、探しているものに近いものはまだ見つかりませんでした。私が求めているのは完全に不可能ですか?
python - Python 2.6から3.5で具象初期化子を使用してPython ABCを作成するには?
コンテキスト
比較的複雑なクラス階層を持つ Python アプリケーションがあります。python 2.6 から python 3.5 までで動作する必要があり (広い範囲です!)、私は ABC で特に問題を抱えていました。私はsix
ライブラリを使用してwith_metaclass
いくつかの傷を和らげていますが、それでも問題があります。
ある特定のクラスのセットで問題が発生しています。単純化した形式で表示すると、次のようになります。
には多くのgamma
同様の関数がバンドルされておりMyABC
、 や のようないくつかのサブクラス固有の関数がalpha
ありbeta
ます。のすべてのサブクラスが同じ属性と属性MyABC
を継承し、独自の特定の特性を積み上げたいと考えています。__init__
gamma
問題
問題は、MyChild1
とのMyChild2
コードを共有するには__init__
、MyABC
具体的な初期化子が必要なことです。Python 3 ではすべて正常に動作していますが、Python 2 ではイニシャライザが具象のTypeErrors
場合、インスタンス化時に get に失敗しますMyABC
。
私のテストスイートには、次のようなセグメントがあります
どういうわけか、Python 2.7 (私は 2.6 を想定していますが、チェックする気にはなりませんでした) では、このテストは失敗しています。
MyABC
には他の抽象プロパティはありませんが、またはgamma
も持たずに を持つクラスをインスタンス化しても意味がありません。今のところ、 と で関数を複製するだけで DRY 違反を回避できていますが、時間が経つにつれて、これはますます負担になってきています。alpha
beta
__init__
MyChild1
MyChild2
Python 3 の互換性を維持しながら、Python 2 ABC に具体的なイニシャライザをインスタンス化可能にせずに与えるにはどうすればよいですか? MyABC
つまり、Python 2 と Python 3 で sをスローするようにインスタンス化を試みたいのですTypeError
が、Python 3 でしかスローしません。
with_metaclass
ここのコードを見るのは適切だと思いwith_metaclass
ます。これは、プロジェクトの既存のライセンスおよび著作権に基づいて提供されsix
ます。(c) 2010-2014 Bejamin Peterson
python - pylint と abc - 抽象メソッド
プロパティが Human の派生クラスに必要であることを明確にしたいと思いderived_config
ます。このプロパティを設定しない派生クラスのコードは実行されないという意味で、抽象プロパティ デコレーターがトリックを行います。
ただし、pylint は次のエラーで失敗します。
注意:
- pylintは抽象プロパティに対して不平を言いませんが、パターンは同じです (ターミナル リーフである
implementation_config
ことを除いて)。OneHandedClown
- クラス変数 implementation_config を削除すると、pylintは文句を言います
OneHandedClown
pylint-disable
継承コントラクトが明示的であることを確認するために抽象プロパティを使用すると同時に、使用せずに lint が確実に通過するようにするにはどうすればよいですか?
python - Python で抽象基本クラスをインスタンス化できるのはなぜですか?
私が理解しているように、 Python でabcモジュールを使用して、インスタンス化できない抽象クラスを作成できます (他の優れたプロパティの中でも)。これを使用して、アプリケーションのさまざまな終了コードを表すクラスの階層を作成しようとしましたException
が、基本クラスをインスタンス化することはできますが、それを望んでいません。問題を示すコードを次に示します。
ExitCodeException
インスタンス化できないという例外でプログラムが終了することを期待していましたが、代わりに、ExitCodeException
抽象的でない場合に期待する標準のスタックトレースを取得するだけです。
どうすればこれを修正できますか?
python - 継承されたクラスで抽象クラスのデコレーターをオーバーライドする
だからここに私が持っているものがあります:
抽象クラス:
継承クラス:
基本的に、さまざまなクラスで使用される一般的なデータ メソッド (DataWrapper で定義) がたくさんあります。デコレータを定義して、返される前にデータに対して前/後処理を実行できるようにします。これは、DataWrapper でプレースホルダーとして定義されています。
残念ながら、継承されたクラスでデコレータを定義しようとしても、デコレータはオーバーライドされません。つまり、「ここ」は印刷されていません。
これを見て、継承されたクラスにオーバーライドデコレータを追加しようとしましたが、エラーはありませんが、「ここ」はまだ出力されていません。
誰にも提案はありますか?