Maison >développement back-end >Tutoriel Python >Restrictions d'accès orientées objet Python

Restrictions d'accès orientées objet Python

不言
不言original
2018-04-14 10:21:251818parcourir

Le contenu partagé avec vous dans cet article concerne les restrictions d'accès orientées objet Python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer

Dans la classe, il peut y avoir des attributs et des méthodes, et Le code externe peut manipuler les données en appelant directement des méthodes sur des variables d'instance, masquant ainsi la logique interne complexe.

Cependant, à en juger par la définition précédente de la classe Student, le code externe peut toujours modifier librement le nom et les attributs de score d'une instance :

class Student(object):
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s:%s'%(self.name,self.score))
    def get_grade(self):
        if self.score >=90:
            return 'A'
        elif self.score>=600:
            return  'B'
        else:
            return  'C'
bart = Student('Boyuan Zhou',100)
print(bart.score)
bart.score=120
print(bart.score)
100
120

Si vous souhaitez que le code interne les attributs doivent être différents Pour y accéder en externe, vous pouvez ajouter deux traits de soulignement __ avant le nom de l'attribut. En Python, si le nom de variable d'une instance commence par __, il devient un attribut privé (privé), accessible uniquement. Accès interne, pas externe, nous changeons donc la classe Student :

class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print('%s:%s'%(self.__name,self.__score))
    def get_grade(self):
        if self.__score >=90:
            return 'A'
        elif self.__score>=600:
            return  'B'
        else:
            return  'C'
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:
bart = Student('Boyuan Zhou',100)
print(bart.__name)Traceback (most recent call last):
  File "F:/mycompany/mycompany/schooldemo.py", line 16, in <module>
    print(bart.__name)
AttributeError: &#39;Student&#39; object has no attribute &#39;__name&#39;

Cela garantit que le code externe ne peut pas modifier l'état interne de l'objet à volonté, de sorte que grâce à la protection. des restrictions d'accès, le code est plus robuste.

Mais que se passe-t-il si le code externe veut obtenir le nom et le score ? Vous pouvez ajouter des méthodes comme get_name et get_score à la classe Student :

class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    
bart = Student(&#39;Boyuan Zhou&#39;,100)
print(bart.get_name())
#Boyuan Zhou

Et si vous souhaitez autoriser du code externe à modifier la partition ? Vous pouvez ajouter la méthode set_score à la classe Student :

class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_name(self):
        return self.__name    def get_score(self):
        return self.__score
    def set_score(self,score):
        self.__score=score

Vous vous demandez peut-être, la méthode originale peut être modifiée directement via bart.score = 59, pourquoi faut-il tant de mal pour définir une méthode ? Parce que dans la méthode, vous pouvez vérifier les paramètres pour éviter de passer des paramètres invalides :

class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_score(self,score):
        if 0 <=score <= 100:
            self.__score=score
        else:
            raise ValueError(&#39;bad score&#39;)

Il est à noter qu'en Python, les noms de variables sont similaires à __xxx___, c'est-à-dire des doubles traits de soulignement commençant et se terminant par un double trait de soulignement sont des variables spéciales. Les variables spéciales sont accessibles directement et ne sont pas des variables privées. Par conséquent, les noms de variables tels que __name__ et __score__ ne peuvent pas être utilisés.

Parfois, vous verrez un nom de variable d'instance commençant par un trait de soulignement, tel que _name. De telles variables d'instance sont accessibles en externe. Cependant, selon la convention, lorsque vous voyez une telle variable, cela signifie "Bien que". Je suis accessible, veuillez me traiter comme une variable privée et n'y accédez pas à volonté.'

Les variables d'instance commençant par des traits de soulignement doubles ne sont-elles pas nécessairement accessibles de l'extérieur ? n'est pas accessible directement, c'est que l'interpréteur Python modifie en externe la variable __name en _Student__name. Par conséquent, vous pouvez toujours accéder à la variable __name via _Student_name :

class Student(object):
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_score(self,score):
        if 0 <=score <= 100:
            self.__score=score
        else:
            raise ValueError(&#39;bad score&#39;)
bart = Student('Boyuan Zhou',100)print(bart._Student__name)
print(bart.get_name())
#Boyuan Zhou
#Boyuan Zhou

Mais il est fortement recommandé de ne pas le faire, car. différentes versions des interpréteurs Python peuvent remplacer __name par différents noms de variables


Recommandations associées :

Classes et exemples Python orientés objet.





Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn