Résumé des connaissances orientées objet Python

巴扎黑
Libérer: 2017-07-23 13:44:41
original
1789 Les gens l'ont consulté

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'
Copier après la connexion

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}
Copier après la connexion
Oh, il s'avère que python a transformé __salary en _People__salary, recommencez

print(p._People__salary)#100000
Copier après la connexion
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
Copier après la connexion
.
      #from B bar  别想多了,调用函数时别看定义位置,要看调用位置
Copier après la connexion
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  有没有感受到编程的享受
Copier après la connexion
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()
Copier après la connexion
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
Copier après la connexion
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
Copier après la connexion
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'
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!