Comment puis-Python travail de propriétés?
J'ai été avec succès à l'aide de Python, mais je ne vois pas comment ils pourraient travailler. Si je déréférencement d'une propriété en dehors de la classe, je viens d'obtenir un objet de type property
:
@property
def hello(): return "Hello, world!"
hello # <property object at 0x9870a8>
Mais si je mets une propriété dans une classe, le comportement est très différent:
class Foo(object):
@property
def hello(self): return "Hello, world!"
Foo().hello # 'Hello, world!'
J'ai remarqué que non Foo.hello
est toujours le property
objet, de sorte que l'instanciation de classe doit être en train de faire de la magie, mais la magie est qui?
- Voir aussi: Comment les @property décorateur de travail?
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont noté, ils utilisent un langage appelé descripteurs.
La raison que la propriété réelle de l'objet est renvoyé lorsque vous accédez par l'intermédiaire d'une classe
Foo.hello
réside dans la façon dont la propriété met en œuvre la__get__(self, instance, owner)
méthode spéciale:owner
est le classe de cette instance.instance
est None et seulementowner
est passé. Leproperty
objet reconnaît cela et renvoieself
.En plus de la Descripteurs howto, voir aussi la documentation sur La Mise En Œuvre De Descripteurs et Invoquant Les Descripteurs De dans le Guide de Langue.
Pour @propriétés de travailler correctement la classe doit être une sous-classe de objet.
quand la classe n'est pas une sous-classe de objet alors la première fois que vous essayez d'accéder à la setter il est en fait un nouvel attribut avec le nom plus court au lieu d'accéder par le biais de l'incubateur.
Ce qui suit ne pas fonctionner correctement.
Ce qui suit fonctionnera correctement
Propriétés sont les descripteurs de, et les descripteurs de se comporter spécialement lorsqu'un membre d'une instance de classe. En bref, si
a
est une instance de typeA
, etA.foo
est un descripteur, puisa.foo
est équivalent àA.foo.__get__(a)
.__get__()
est incorrect. Il a deux arguments (en soi). Sinon bien expliqué.__get__()
donné sur la page liée dans mon post. Le deuxième argument doit être en option, qui fait partie du protocole.__get__()
dans la section précédente, il est dit "propriétaire est toujours le propriétaire de la classe", et lorsque le descripteur de fichier est appelée en fait que d'un descripteur, c'est toujours passé. Il n'est pas important, j'ai surtout essayer de clarifier la façon dont il pourrait produire un résultat différent lorsque l'on y accède via la classe.La
property
objet implémente le protocole descripteur: http://docs.python.org/howto/descriptor.html