7
votes

Pourquoi quelqu'un utiliserait-il @Property si aucun pointigège ou Delier n'est défini?

dans le code Python, je vois souvent l'utilisation de @property.

Si je comprends correctement, avec le Fonction de propriété Un getter Setter et Deleter peut être défini.

Pourquoi utiliserait-on @Property si le setter et le Deleter ne sont pas définis (@ x.setter, @ x.delterter)? N'est-ce pas le même que de ne pas utiliser @property du tout?


0 commentaires

3 Réponses :


9
votes

Cela crée une API qui ne permet pas de définir une valeur. Ceci est similaire dans d'autres langues à une constante.


4 commentaires

Une constante? Le getter est une fonction qui peut donner un résultat différent à chaque appel. Ou la fonction de propriété ne fait-elle que l'évaluer une fois dans la durée de vie de l'objet, qui n'a pas de sens. Je comprends cependant maintenant quel est l'avantage, mais je ne pense pas que cela ressemble à une constante.


Il y a absolument des différences, mais il y a aussi des chevauchements, j'utilise la signification littérale de similaire ici.


Je suppose que ceci n'est que si vous préfixez la variable avec double soulignement, sinon vous pouvez toujours la définir avec ou sans @property . Je suis également arrivé ici comme je me suis demandé s'il y avait un point à utiliser @property sur quelque chose de non constant qui ne doit pas avoir de seigur.


Pour ajouter à la discussion, ce concept a reçu le nom de "propriété calculée" dans certains cadres et langages de programmation (SWIFT est un excellent exemple).



3
votes

Définition d'une propriété avec une fonction getter mais sans seigur peut être très utile dans certains scénarios. Disons que vous avez un modèle comme ci-dessous à Django; Un modèle est essentiellement une table de base de données avec des entrées appelées champs. Le nom d'hôte de propriété est calculé à partir d'un ou de plusieurs champs du modèle de la base de données. Ce contournement nécessitant une autre entrée dans la table de base de données à modifier chaque fois que les champs correspondants sont modifiés.

Le véritable avantage de l'utilisation d'une propriété est appelant objet.hostname () vs. code> objet.hostname . Ce dernier est transmis avec l'objet automatiquement alors lorsque nous allons dans un endroit comme un modèle Jinja, nous pouvons appeler objet.hostname mais appeler objet.hostname () augmentera un Erreur.

L'exemple ci-dessous est un modèle VirtualMachine avec un champ Nom et un exemple du code Jinja où nous avons passé un objet VirtualMachine. xxx


1 commentaires

C'est une bonne réponse. Vous pouvez également modifier la valeur de votre propriété en fonction d'autres kwargs. Si vous créez un Self._HostName et devez modifier le nom d'hôte en fonction d'autres kwargs - vous pouvez facilement le faire dans votre déclaration de méthode - `` `` @property def schéma (auto): sinon selfertificate: retour f '{ Self._scheme} 'Retour F' {Self._scheme} + {Self.certificate} '`` ``



0
votes

C'est une bonne réponse. De plus, vous pouvez également modifier la valeur de votre propriété en fonction d'autres kwargs et le faire dans la même déclaration de méthode. Si vous créez une variable d'instance Self._HostName, vous pouvez également modifier la valeur en fonction d'autres kwargs ou de variables. Vous pouvez également obtenir la valeur de votre propriété et l'utiliser dans d'autres méthodes telles que Self.Scheme (voir ci-dessous) est syntaxiquement et simple :).

class Neo4j(Database):
    def __init__(self, label, env, username, password, hostname, port=None, routing_context=False, policy=None, scheme=None, certificate=None):
        super().__init__(label, env)
        
        self.username = username
        self._password = password
        self.hostname = hostname
        self.port = port # defaults, 7687
        self._scheme = scheme # example - neo4j, bolt
        self.routing_context = routing_context # self.policy = policy policy=None,
        self.policy = policy # Examples, europe, america
        self.certificate = certificate # examples, None, +s, +ssc

    @property
    def scheme(self):
        if not self.certificate:
            return f'{self._scheme}'
        return f'{self._scheme}+{self.certificate}'

    def __repr__(self) -> str:
        return f'<{self.scheme}://{self.hostname}:{self.port}>' #if self.ro


db = Neo4j(label='test', env='dec', username='jordan', password='pass', hostname='localhost', port=7698, scheme='neo4j', certificate='ssc')

print(db.scheme) >>> neo4j+ssc


0 commentaires