Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung des objektorientierten Python-Wissens

Zusammenfassung des objektorientierten Python-Wissens

巴扎黑
巴扎黑Original
2017-07-23 13:44:411802Durchsuche

Kapselung

1. Warum Kapselung?

Bei der Kapselung werden die spezifischen Implementierungsdetails von Datenattributen und -methoden ausgeblendet und nur eine Schnittstelle bereitgestellt. Die Kapselung muss sich nicht darum kümmern, wie das Objekt aufgebaut ist

2. Die Kapselung umfasst die Datenkapselung und die Funktionskapselung. Die Datenkapselung dient dem Schutz der Privatsphäre und die Funktionskapselung dient der Isolierung der Komplexität

3. Die Kapselung der Daten besteht darin, vor dem Attribut ein __

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'

hinzuzufügen. Hey, es wurde ein Fehler gemeldet und wir sehen, was passiert ist 🎜>

print(p.__dict__)#{'name': 'zhang', 'age': 19, '_People__salary': 100000}
Oh, es stellt sich heraus, dass Python __salary in _People__salary umgewandelt hat, machen Sie es noch einmal

print(p._People__salary)#100000
Es gibt also kein Absolutes Verstecken in Python. Solange Sie das oben Genannte wissen, besteht keine Notwendigkeit, es zu verbergen

Diese Transformationsoperationen finden nur in der Definitionsphase der Klasse oder der Objektdefinitionsphase (Instanziierungsphase) statt

Obwohl auf das hinzugefügte __-Attribut nicht direkt von außen zugegriffen werden kann, kann auf es innerhalb der Klasse zugegriffen werden. Es versteht sich, dass der Python-Interpreter es automatisch erkennt, solange es in der Definitionsphase auf ein Attribut trifft, das mit __ beginnt ein _class name__-Attribut, damit innerhalb der Klasse darauf zugegriffen werden kann. Ja, in diesem Fall können wir einige kleine Dinge tun

Schauen wir uns das zuerst an

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  别想多了,调用函数时别看定义位置,要看调用位置
Wenn Sie nur die Leiste der übergeordneten Klasse aufrufen möchten, was ist mit der ()-Funktion? Was zu tun ist

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. Gekapselte Anwendung

1) Lassen Sie die Außenwelt nicht sehen, wie unsere Datenattribute definiert sind, sie können nur von bereitgestellt werden Sehen Sie sich auf unserer Benutzeroberfläche den Inhalt an, den wir der Außenwelt anzeigen lassen

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) Ein häufigeres Szenario besteht darin, dass wir die Art der Daten einschränken, unsere eigene Logik hinzufügen und dann kapseln Sie es ein Geben Sie dem Benutzer

    def tell_name(self):print(self.__name)#修改名字def set_name(self,new):if not isinstance(new,str):raise TypeError('名字必须是字符串类型')
        self.__name=new
5. Betrachtet man unsere obige Operation, muss der Benutzer p.tell_name() verwenden, wenn er den Namen überprüft. Es war ursprünglich ein Datenattribut, aber Wir haben es geändert in „Wie verschleiere ich eine Funktion?“ Sie können die integrierte Funktionseigenschaft verwenden

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
Die Datenattribute sollten auch geändert und gelöscht werden

    @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'

Das obige ist der detaillierte Inhalt vonZusammenfassung des objektorientierten Python-Wissens. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn