PythonにはConstはありませんが,こちらの記事に疑似的にConstのクラスを作成する方法がありました
Pythonのクラス変数を定数(再代入禁止の変数)として扱う - 名前空間を分けたい
Python
1class ConstMeta(type): 2 def __setattr__(self, name, value): 3 if name in self.__dict__: 4 raise TypeError(f'Can\'t rebind const ({name})') 5 else: 6 self.__setattr__(name, value) 7 8# 定数定義 9class MyConstClass(metaclass=ConstMeta): 10 X = 10 11 Y = 20
この方法では,確かにclass内で定義したXとYには外部から代入出来ません.
ただし,不完全なところがありConstMetaのelse節内部のself.setattr(name,value)で必ずTypeError: expected 2 arguments, got 1
が表示されてしまいます.(Constとしての機能は果しています)
このelse部分をなんとかすることで,その変数名が定義されていない場合,外部から代入することができるが,既に定義されている場合,再代入を禁止するようなJavaでいうfinalみたいなものを作りたいのです.(追記:Javaのfinal演算子の挙動を勘違いしていたかもしれないので,打消し線を入れておきます)
(追記:また,参考サイトの冒頭にあるコードでも,所望の動作はするのですが,名前空間をわけることができないため,複数そのようなクラスをつくるというようなことができません.)
self.dict[name]=value
としようかと思ったのですが
この__dict__はmappingproxyですので,
TypeError: 'mappingproxy' object does not support item assignment
となります.
なにか良い知恵,代替手段のようなものはないでしょうか?
やりたいこと
その変数名が定義されていない場合,外部から代入することができるが,既に定義されている場合,再代入を禁止するようなメタクラスの実装
回答1件
あなたの回答
tips
プレビュー