記述子がクラスでアクセスされる場合、記述子オブジェクト自体を返すのは(通常)慣例です。これが何をするかproperty
です。クラスのプロパティオブジェクトにアクセスすると、プロパティオブジェクトが返されます(これは、__get__
メソッドが選択するためです)。しかし、それは慣例です。そのようにする必要はありません。
したがって、クラスにゲッター記述子があれば十分であり、設定しようとすると記述子が上書きされることを気にしない場合は、メタクラスプログラミングなしで次のようなことを行うことができます。
def classproperty_getter_only(f):
class NonDataDescriptor(object):
def __get__(self, instance, icls):
return f(icls)
return NonDataDescriptor()
class Foo(object):
@classproperty_getter_only
def flup(cls):
return 'hello from', cls
print Foo.flup
print Foo().flup
にとって
('hello from', <class '__main__.Foo'>)
('hello from', <class '__main__.Foo'>)
本格的なデータ記述子が必要な場合、または組み込みのプロパティオブジェクトを使用する場合は、メタクラスを使用してそこに配置できます(この属性は、クラスのインスタンスからは完全に見えないことに注意してください。メタクラスクラスのインスタンスで属性ルックアップを実行する場合は検査されません)。
それはお勧めですか?私はそうは思わない。私はあなたが本番コードで何気なく説明していることをしません。私はそうする非常に説得力のある理由がある場合にのみそれを検討します(そして私は頭のてっぺんからそのようなシナリオを考えることはできません)。メタクラスは非常に強力ですが、すべてのプログラマーに十分に理解されているわけではなく、推論するのがやや難しいため、メタクラスを使用するとコードの保守が難しくなります。この種のデザインは、Pythonコミュニティ全体で眉をひそめるだろうと思います。