[解決済み] メタクラスの(具体的な)使用例とは?
質問
メタクラスを好んで使う友人がいて、定期的に解決策を提示しています。
私は、メタクラスを使用する必要はほとんどないと考えています。なぜかというと、クラスにそのようなことをするのであれば、おそらくオブジェクトにするべきだと考えるからです。そして、小さな再設計/リファクタリングが必要です。
メタクラスを使えるようになったことで、多くの場所で多くの人がクラスをある種の二流のオブジェクトとして使うようになり、それは私には悲惨に思えます。プログラミングは、メタプログラミングに取って代わられるのでしょうか?クラスデコレーターの追加により、残念ながらさらに受け入れられやすくなっています。
だから、私はPythonでメタクラスのためのあなたの有効な(具体的な)ユースケースを知るために必死になっています。あるいは、なぜクラスを変異させることが、時々、オブジェクトを変異させるよりも良いのかについて、啓発されたいのです。
私は始めます。
時々、サードパーティの サードパーティライブラリを使用する場合、特定の方法で が便利なことがあります。
(このケースしか思いつきませんし、具体的ではありません)
どのように解決するのですか?
Matplotlibのフロントエンドとして、非対話的なプロットを処理するクラスがあります。 しかし、時折、対話的なプロットを行いたいと思うことがあります。 いくつかの関数で、図形の数を増やしたり、手動で描画を呼び出したりできることがわかりましたが、描画を呼び出すたびにその前後でこれらを行う必要がありました。 そこで、インタラクティブな描画ラッパーとオフスクリーン描画ラッパーの両方を作成するために、次のようなことをするよりも、適切なメソッドをラップしたメタクラスを介してこれを行う方がより効率的であることがわかりました。
class PlottingInteractive:
add_slice = wrap_pylab_newplot(add_slice)
この方法は、APIの変更などに対応できませんが、クラス属性を反復するものは
__init__
にあるクラス属性を再セットするものの方が効率的で、最新の状態を保つことができます。
class _Interactify(type):
def __init__(cls, name, bases, d):
super(_Interactify, cls).__init__(name, bases, d)
for base in bases:
for attrname in dir(base):
if attrname in d: continue # If overridden, don't reset
attr = getattr(cls, attrname)
if type(attr) == types.MethodType:
if attrname.startswith("add_"):
setattr(cls, attrname, wrap_pylab_newplot(attr))
elif attrname.startswith("set_"):
setattr(cls, attrname, wrap_pylab_show(attr))
もちろん、もっと良い方法があるかもしれませんが、私はこれが効果的であると感じています。 もちろん、これは
__new__
または
__init__
などがありますが、これが一番わかりやすい解決策でした。
関連
-
ピロウズ画像色処理の具体的な活用方法
-
PythonによるExcelファイルの一括操作の説明
-
Python 入出力と高次代入の基礎知識
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] Pythonの「名前付きタプル」とは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonによるjieba分割ライブラリ
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?