Il est conventionnel (habituellement), pour un descripteur, d'accéder à une classe pour renvoyer l'objet descripteur lui-même. C'est ce que fait property
; Si vous accédez à un objet de propriété sur une classe, vous récupérez l'objet de propriété (parce que c'est ce que la méthode __get__
choisit de faire). Mais c'est une convention. vous n'avez pas à le faire de cette façon.
Donc, si vous avez seulement besoin d'avoir un descripteur getter votre classe, et ne vous dérange pas que tenter de définir écrasera le descripteur, vous pouvez faire quelque chose comme cela sans programmation métaclasse:
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
pour
('hello from', <class '__main__.Foo'>)
('hello from', <class '__main__.Foo'>)
Si vous voulez un descripteur de données à part entière, ou si vous voulez utiliser l'objet intégré de la propriété, alors vous avez raison, vous pouvez utiliser une méta-classe et le mettre là (la réalisation que cet attribut sera totalement invisible des instances de votre classe; les métaclasses ne sont pas examinées lors de la recherche d'attribut sur une instance d'une classe).
Est-il conseillé? Je ne pense pas. Je ne ferais pas ce que vous décrivez avec désinvolture dans le code de production; Je ne considérerais cela que si j'avais une raison très convaincante de le faire (et je ne peux pas penser à un tel scénario au sommet de ma tête). Les métaclasses sont très puissantes, mais elles ne sont pas bien comprises par tous les programmeurs et sont plus difficiles à raisonner, leur utilisation rend votre code plus difficile à maintenir. Je pense que ce genre de conception serait désapprouvé par la communauté python dans son ensemble.
Ce fil pourrait être utile: http://stackoverflow.com/questions/128573 – Philipp
En effet, c'est presque un doublon, sauf que j'ai explicitement demandé à propos de la sous-classe 'type', alors que c'est juste suggéré dans l'une des réponses pour cette question. – intuited