[解決済み] init__ の外側で新しい属性を作成しないようにする。
2023-01-09 15:30:53
質問
Pythonで)クラスを作りたいのですが、一旦
__init__
で初期化されると、新しい属性は受け付けませんが、既存の属性の修正は受け付けます。これを行うには、いくつかのハック的な方法があります。
__setattr__
メソッドを使うなどです。
def __setattr__(self, attribute, value):
if not attribute in self.__dict__:
print "Cannot set %s" % attribute
else:
self.__dict__[attribute] = value
を編集し、さらに
__dict__
の中に直接
__init__
の中にあるのですが、これを行うための「適切な」方法があるのでしょうか?
どのように解決するのですか?
私なら
__dict__
を直接使用することはありませんが、インスタンスを明示的に "freeze" するための関数を追加することができます。
class FrozenClass(object):
__isfrozen = False
def __setattr__(self, key, value):
if self.__isfrozen and not hasattr(self, key):
raise TypeError( "%r is a frozen class" % self )
object.__setattr__(self, key, value)
def _freeze(self):
self.__isfrozen = True
class Test(FrozenClass):
def __init__(self):
self.x = 42#
self.y = 2**3
self._freeze() # no new attributes after this point.
a,b = Test(), Test()
a.x = 10
b.z = 10 # fails
関連
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの旧スタイルのクラスと新スタイルのクラスの違いは何ですか?
-
[解決済み] init__と__call__の違いは何ですか?
-
[解決済み] Pythonで'super'は何をするのですか?- super().__init__() と明示的なスーパークラス __init__() の違い
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて