まあ、最初に警告された問題を軽視しているわけではありません。ただし、特定の場合に役立つ場合があります。
まず第一に、私がこの投稿を探している理由は、私がこれをしただけで、それ__slots__
が気に入らないからです. (はい、私のコードはスロットの有効な使用例です。これは純粋なメモリの最適化です)、スロットの問題を回避しようとしていました。
これは、Alex Martelli の Python Cookbook (第 1 版) で初めて見ました。第 3 版では、レシピ 8.19「ステートフル オブジェクトまたはステート マシンの問題の実装」です。Pythonに関しては、かなり知識のあるソースです。
InactiveEnemy とは動作が異なる ActiveEnemy オブジェクトがあり、それらの間をすばやく切り替える必要があるとします。たぶんDeadEnemyでさえ。
InactiveEnemy がサブクラスまたは兄弟である場合、クラス属性を切り替えることができます。より正確には、正確な祖先は、それを呼び出すコードと一貫性のあるメソッドと属性ほど重要ではありません。Javaインターフェイスを考えてみてください。または、何人かが言及しているように、クラスはこの使用を念頭に置いて設計する必要があります。
今でも、状態遷移規則やその他のあらゆる種類のものを管理する必要があります。そして、はい、クライアント コードがこの動作を予期しておらず、インスタンスが動作を切り替える場合、事態はファンに打撃を与えます。
しかし、私はこれを Python 2.x で非常にうまく使用しており、異常な問題は一度もありませんでした。共通の親と、同じメソッド シグネチャを持つサブクラスの小さな動作の違いを使用して行うのが最適です。
__slots__
ちょうど今それをブロックしている私の問題まで、問題ありません。しかし、スロットは一般的に首の痛みです。
ライブコードにパッチを当てるためにこれを行うことはありません。また、ファクトリ メソッドを使用してインスタンスを作成することもできます。
しかし、事前にわかっている非常に具体的な条件を管理するには? クライアントが完全に理解することが期待されるステートマシンのようなものですか? それから、それは魔法にかなり近いものであり、それに付随するすべてのリスクがあります. とてもエレガントです。
Python 3 の懸念事項? 動作するかどうかをテストしますが、Cookbook では例として FWIW で Python 3 の print(x) 構文を使用しています。