Python 3.9 から @classmethod
と @property
の重ねがけができるようになった事に気づきました。
バージョン 3.9 で変更: Class methods can now wrap other descriptors such as property().
https://docs.python.org/ja/3.9/library/functions.html#classmethod
ということで、早速実験してみました。
>>> class Foo:
... @classmethod
... @property
... def prop(self):
... print('Hello class property!')
... return "hello"
こういうクラスを作っておいて、クラス属性 prop
を呼び出すと、メソッドが呼び出され、値が返ります。
>>> Foo.prop
Hello class property!
'hello'
ちなみに、インスタンス化したあともプロパティとして動作します。
>>> Foo().prop
Hello class property!
'hello'
これまであまり class property を作ろうと思ったことがなかったのですが、面白い使いみちがないか考えてみようと思います。