Maison >développement back-end >Tutoriel Python >Résumé des connaissances orientées objet Python

Résumé des connaissances orientées objet Python

巴扎黑
巴扎黑original
2017-07-23 13:44:411834parcourir

Encapsulation

1. Pourquoi l'encapsulation ?

L'encapsulation consiste à masquer les détails d'implémentation spécifiques des attributs et des méthodes de données, et à fournir uniquement une interface. L'encapsulation n'a pas besoin de se soucier de la façon dont l'objet est construit

2. L'encapsulation comprend l'encapsulation des données et l'encapsulation des fonctions. L'encapsulation des données vise à protéger la confidentialité, et l'encapsulation des fonctions consiste à isoler la complexité

3. L'encapsulation des données consiste à ajouter un __

class People:def __init__(self,name,age,salary):
        self.name=name
        self.age=age
        self.__salary=salary
p=People('zhang',19,100000)print(p.name)#zhangprint(p.age)#19print(p.__salary)#AttributeError: 'People' object has no attribute '__salary'

devant l'attribut Hé, une erreur a été signalée. Ouvrons l'espace de noms de l'objet et voyons ce qui s'est passé <.>

print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
Oh, il s'avère que python a transformé __salary en _People__salary, recommencez

print(p._People__salary)#100000
Donc, il n'y a pas d'absolu se cacher en Python, Tant que vous savez ce qui précède, il n'est pas nécessaire de le cacher

Ces opérations de transformation n'interviennent que dans la phase de définition de la classe ou la phase de définition de l'objet (phase d'instanciation)

Bien qu'il ne soit pas accessible directement depuis l'extérieur de l'attribut __, mais il est accessible à l'intérieur de la classe. On comprend que dans la phase de définition, tant qu'il rencontre un attribut commençant par __, l'interpréteur Python le reconnaît automatiquement. en tant qu'attribut _class name__, afin qu'il soit accessible à l'intérieur de la classe. Oui, dans ce cas, nous pouvons faire quelques petites choses

Regardons cela d'abord

class A:def foo(self):print('from A foo')
        self.bar()def bar(self):print('from A bar')class B(A):def bar(self):print('from B bar')
b=B()
b.foo()  #from A foo
.
      #from B bar  别想多了,调用函数时别看定义位置,要看调用位置
Si vous souhaitez simplement appeler la barre de la classe parent. Et la fonction () ? Que faire

class A:def foo(self):print('from A foo')
        self.__bar()def __bar(self):print('from A bar')class B(A):def __bar(self):print('from B bar')
b=B()
b.foo() #from A foo#from A bar  有没有感受到编程的享受
4. Application encapsulée

1) Ne laissez pas le monde extérieur voir comment nos attributs de données sont définis, ils ne peuvent être fournis que par nous interface, voir le contenu que nous permettons au monde extérieur de voir

class People:def __init__(self,name,age,height,weight,hobby):
        self.__name=name
        self.__age=age
        self.__height=height
        self.__weight=weight
        self._hobby=hobbydef tell_info(self):print('''name:%s
        age:%s
        height:%s
        weeight:%s'''%(self.__name,self.__age,
             self.__height,self.__weight))
p=People('zhang',18,1.90,75,'read')
p.tell_info()
2) Un scénario plus courant est que nous pouvons limiter le type de données, ajouter notre propre logique, puis encapsulez-le Donnez à l'utilisateur

    def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型')
        self.__name=new
5. En regardant notre opération ci-dessus, l'utilisateur doit p.tell_name() lors de la vérification du nom. Il s'agissait à l'origine d'un attribut de données, mais. nous l'avons changé en Comment déguiser une fonction ? Vous pouvez utiliser la propriété de fonction intégrée

class People:def __init__(self,name,age,height,weight,hobby):
        self.__name=name
        self.__age=age
        self.__height=height
        self.__weight=weight
        self._hobby=hobby
    @propertydef name(self):return self.__namep=People('zhang',18,1.90,75,'read')print(p.name)#zhang
Les attributs de données doivent également être modifiés et supprimés

    @propertydef name(self):return self.__name#name已经被property修饰过,就有setter和deleter    @name.setterdef name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型')
        self.__name=new
    @name.deleterdef name(self):del self.__namep = People('zhang', 18, 1.90, 75, 'read')print(p.name)#zhangp.name='can'    #修改print(p.name)#candel p.name #删除print(p.name)#AttributeError: 'People' object has no attribute '_People__name'

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