Latest web development tutorials

Python objektorientierte

Python wurde von Anfang an so konzipiert ist eine objektorientierte Sprache, und als solche eine Klasse und Objekte in Python zu erstellen ist sehr einfach. In diesem Abschnitt werden wir ausführlich die objektorientierte Programmierung in Python.

Wenn Sie nicht in die objektorientierte Programmiersprache ausgesetzt worden sind, dann müssen Sie zunächst einige der grundlegenden Merkmale der objektorientierten Sprachen verstehen, im Kopf in einem Grundkonzept der objektorientierten gebildet, die Sie leichter lernen, die Python hilft objektorientierte Programmierung.

Als nächstes wollen wir ein einfaches Verständnis der objektorientierten nehmen unter einigen grundlegenden Funktionen.


Objektorientierte Technologie-Überblick

  • Klasse (Class): verwendet , um die Sammlung zu beschreiben , haben die gleichen Eigenschaften und Methoden von Objekten. Es definiert eine Reihe von Eigenschaften und Methoden gemeinsam zu jedem Objekt. Objekte sind Instanzen von Klassen.
  • Klassenvariablen: Klassenvariablen ist im gesamten instanzierte Objekt gemeinsam. Klassenvariablen definiert und außerhalb der Funktion in der Klasse in. Klassenvariablen normalerweise nicht als Instanzvariablen verwendet.
  • Datenelemente: Klassenvariablen oder Instanzvariablen für die zugehörigen Datenverarbeitungsklassen und Instanzobjekte.
  • Überschreibungen: Wenn Sie die Anforderungen nicht erfüllen kann eine Unterklasse von der übergeordneten Klasse Methode erbt, kann sie neu geschrieben werden, einen Prozess namens Overlay - Verfahren (Überschreibung), die auch als übergeordnete Verfahren bekannt.
  • Beispiele der Variablen: Variable in der Methode definiert, wird nur die Rolle der Klasse der aktuellen Instanz.
  • Vererbung: Das ist eine abgeleitete Klasse (abgeleitete Klasse) erbt die Basisklasse (Basisklasse) Felder und Methoden. Die Vererbung ermöglicht auch eine abgeleitete Klasse Objekt als Basisklasse Objekt behandeln. Zum Beispiel gibt es eine solche Konstruktion: ein Objekttyp, der von einem Hund Animal-Klasse abgeleitet wird, das ist ein analoges "ist ein (is-a)" Beziehung (Abb Beispiel ein Hund Tier ist).
  • Instantiate: eine Instanz einer Klasse, die spezifische Objektklasse erstellen.
  • Methoden: Die Klasse definierte Funktionen.
  • Objekt: Datenstruktur - Instanz durch die Klassendefinition. Datenobjekte umfassen zwei Elemente (Klassen- und Instanzvariablen) und Methoden.

erstellen Klasse

Verwenden Sie die Anweisung class eine neue Klasse, nach der Klasse zu erstellen, und der Klassenname endet mit einem Doppelpunkt, die folgenden Beispiele:

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体

Help-Klasse kann von Class .__ doc__ betrachtet werden.

class_suite bestehend aus Mitgliedern der Klasse, Methode Datenattribute.

Beispiele

Im Folgenden ist eine einfache Python-Klasseninstanz:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • empCount Variable ist eine Klassenvariable, wird sein Wert zwischen allen Instanzen dieser Klasse geteilt werden. Sie können Employee.empCount Zugang innerhalb der Klasse oder außerhalb des Unterrichts verwenden.
  • Die erste Methode __init __ () Methode ist eine spezielle Methode, Konstruktor oder Klasseninitialisierung Methode wird aufgerufen, wenn eine Instanz dieser Klasse erstellt die Methode aufrufen

Erstellen Sie eine Instanz eines Objekts

Um eine Instanz einer Klasse erstellen, können Sie den Namen der Klasse zu verwenden, und akzeptieren Parameter __init__ Methode.

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

Access Properties

Sie können den Punkt (.) Eigenschaft nutzen das Objekt zuzugreifen. Der Zugriff auf eine Klassenvariable mit dem Namen der Klasse wie folgt:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

Komplettes Beispiel:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

Führen Sie den obigen Code Ausgabeergebnisse sind wie folgt:

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

Sie können hinzufügen, löschen, um die Eigenschaften der Klasse wie folgt ändern:

emp1.age = 7  # 添加一个 'age' 属性
emp1.age = 8  # 修改 'age' 属性
del emp1.age  # 删除 'age' 属性

Sie können auch auf die Eigenschaften folgende Funktionen zur Verfügung:

  • getattr (obj, name [, default]): Eigenschaft Zugriff auf Objekte.
  • hasattr (obj, Name): Überprüfen Sie, ob ein Attribut ist.
  • setattr (obj, name, value): eine Eigenschaft festgelegt. Wenn die Eigenschaft nicht existiert, erstellen Sie eine neue Eigenschaft.
  • delattr (obj, Name): Attribute löschen.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

Python eingebaute Klasse Attribut

  • __dict__: Attribute der Klasse (einschließlich einem Wörterbuch, das Attribut Datenklassenzusammensetzung)
  • __doc__: Dokument String-Klasse
  • __name__: Klassenname
  • __module__: Modul, in dem die Klassendefinition (der vollständige Name ist ". __main __ classname ', wenn die Klasse in einem importierten Modul mymod befindet, dann classname .__ module__ gleich mymod)
  • __bases__: Alle Klassen des Elternelements (eine Elternklasse, bestehend aus allen Tupeln bestehend)

Python ruft die eingebaute Klasse Attribut Beispiele sind wie folgt:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

Führen Sie den obigen Code Ausgabeergebnisse sind wie folgt:

Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}

Python Objekt (Garbage Collection) zerstört

Wie die Programmiersprache Java verwendet Python Referenz diese einfache Technik Zählen Objekte im Speicher zu verfolgen.

In Python interne Aufzeichnung aller Objekte, die die jeweiligen Zahlen von Referenzen verwenden.

Eine interne Tracking-Variablen, genannt einen Referenzzähler.

Wenn ein Objekt erstellt wird, erstellt es einen Referenzzähler, wenn das Objekt nicht mehr benötigt wird, das heißt, 0 wird ein Verweis auf die Objektanzahl ist es Müll gesammelt. Aber die Erholung ist nicht "sofort" vom Dolmetscher zu gegebener Zeit, die Müllobjekte besetzen Rekultivierung Speicherplatz.

a = 40      # 创建对象  <40>
b = a       # 增加引用, <40> 的计数
c = [b]     # 增加引用.  <40> 的计数

del a       # 减少引用 <40> 的计数
b = 100     # 减少引用 <40> 的计数
c[0] = -1   # 减少引用 <40> 的计数

Garbage Collection-Mechanismus nicht nur für die Objektreferenzanzahl 0 ist, kann das gleiche auch den Fall von zirkulären Referenzen behandeln. Es bezieht sich auf eine zirkuläre Referenz verweisen zwei Objekte zueinander, aber keine anderen Variablenreferenzen sie. In diesem Fall ist nur der Referenzzähler nicht genug. Python Garbage Collector ist eigentlich ein Verweis auf einen Zykluszähler und der Garbage Collector. Als ein zusätzlicher Garbage Collector Referenzzählung wird die Aufmerksamkeit auf die Gesamtmenge von großen Objekten zugeordnet zahlen (und nicht mitgerechnet diejenigen, die durch Referenz zerstört). In diesem Fall wird der Dolmetscher unterbrechen, zu versuchen, alle die nicht referenzierte Zyklus zu bereinigen.

Beispiele

Destructor __del__, __ del__ wird aufgerufen, wenn das Objekt zerstört wird, wenn das Objekt nicht mehr verwendet werden, __ del__ Methode auszuführen:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "销毁"

pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3

Beispiele für die obigen Ergebnisse sind wie folgt:

3083401324 3083401324 3083401324
Point 销毁

Hinweis: In der Regel müssen Sie eine Klasse in einer separaten Datei definieren,

Klassenvererbung

Einer der Hauptvorteile der objektorientierten Programmierung gebracht Wiederverwendung von Code wiederzuverwenden eine davon zu erreichen, durch die Vererbungsmechanismus ist. Geerbte völlig verständlich Typ und Subtyp Beziehung zwischen den Klassen in.

Caveat: Inheritance Syntax - Klasse abgeleiteten Klassennamen (die Basisklasse Name): // ... Schreiben der Basisklassennamen in Klammern, wenn die Basisklasse der Klassendefinition ist unter Angabe Tupel.

In Python Folge von einige der Features:

  • 1: In der folgenden Konfiguration (__init __ () Methode) Cheng Zhongji Klasse wird nicht automatisch aufgerufen werden, es erfordert spezialisierte persönlich im Konstruktor seiner abgeleiteten Klasse aufgerufen.
  • 2: Wenn Sie die Basisklassenmethode aufrufen, müssen Sie den Klassennamen Präfix der Basisklasse hinzuzufügen, und die Notwendigkeit, sich selbst Parametervariablen zu bringen. Brauchen Sie nicht selbst Parameter zu bringen unterscheidet sich von der normalen Funktionsaufruf in der Klasse
  • 3: Python immer zuerst die entsprechende Art von Ansatz zu finden, wenn es nicht die entsprechende Methode in einer abgeleiteten Klasse nicht finden, es begann eine nach der anderen auf die Basisklasse zu suchen. (Erste Methode ruft in dieser Klasse zu finden, die nur die Basisklasse zu finden zu finden).

Wenn die Spalte mehr als eine Klasse in der Vererbungs Tupel, dann wird er als "Mehrfachvererbung" genannt.

Syntax:

Erklärung der abgeleiteten Klasse, ähnlich wie ihre Elternklasse, erben dann die Basisklasse Liste mit den Namen der Klasse, wie folgt:

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

Beispiel:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print "调用父类构造函数"

   def parentMethod(self):
      print '调用父类方法'

   def setAttr(self, attr):
      Parent.parentAttr = attr

   def getAttr(self):
      print "父类属性 :", Parent.parentAttr

class Child(Parent): # 定义子类
   def __init__(self):
      print "调用子类构造方法"

   def childMethod(self):
      print '调用子类方法 child method'

c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法

Der obige Code wird wie folgt ausgeführt:

调用子类构造方法
调用子类方法 child method
调用父类方法
父类属性 : 200

Sie können mehrere Klassen erben

class A:        # 定义类 A
.....

class B:         # 定义类 B
.....

class C(A, B):   # 继承类 A 和 B
.....

Sie können issubclass () oder isinstance () Methode zur Erkennung verwenden.

  • issubclass () - Boolesche Funktion, um zu bestimmen, ob eine Klasse eine Unterklasse einer anderen Klasse ist oder abgeleiteten Klasse Syntax: issubclass (sub, sup)
  • isinstance (obj, Klasse) Boolesche Funktion, wenn obj eine Instanz einer Objektklasse oder Instanz-Objekt-Klasse Klasse ist eine Unterklasse true zurückgibt.

Methode überschreibt

Wenn die Funktion, die Sie die übergeordnete Klasse Methode sind nicht Ihre Bedürfnisse erfüllen können, können Sie Ihre Eltern-Klasse-Methode in einer Unterklasse neu zu schreiben:

Beispiel:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
   def myMethod(self):
      print '调用父类方法'

class Child(Parent): # 定义子类
   def myMethod(self):
      print '调用子类方法'

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

Führen Sie den obigen Code Ausgabeergebnisse sind wie folgt:

调用子类方法

Stiftung überladene Methoden

Die folgende Tabelle enthält einige der häufigsten Funktionen, die Sie in Ihrer Klasse überschreiben können:

Nein. Das Verfahren, das einfach anrufen &
1 __init__ (self [args ...] )
Einfach den Konstruktor -Methode aufrufen:obj = classname (args)
2 __del __ (self)
Destructors, ein Objekt einfacheMethodenaufruf löschen:dell obj
3 __repr __ (self)
Die Umwandlung der Form für den Interpreter einen einfachenMethodenaufrufzulesen:repr (obj)
4 __str __ (self)
Für den Wert in eine geeignete Form für die menschliche Lesung eine einfacheMethodenaufruf:str (obj)
5 __cmp__ (self, x)
Objekt relativ einfachenMethodenaufruf:cmp (obj, x)

Überladen von Operatoren

Python unterstützt auch Überladen von Operatoren, Beispiele sind wie folgt:

#!/usr/bin/python

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2

Die obigen Codeausführung Ergebnisse sind wie folgt:

Vector(7,8)

Klasse Attribute und Methoden

Privatbesitz Klasse

__private_attrs: beginnend zwei Unterstrichen besagt , dass das Eigentum ist privat und nicht verwendet werden kann oder direkt in der Klasse von außen zugänglich. Selbst .__ private_attrs , wenn sie innerhalb einer Klassenmethode verwendet.

Klassenmethoden

Im terrestrischen Innenraum kann die Verwendung Schlüsselwort def als Klassenmethode definiert werden, mit der allgemeinen Definition der verschiedenen Funktionen, Klassenmethoden müssen den Parameter selbst gehören, und als ersten Parameter

Private Methoden der Klasse

__private_method: die ersten beiden Unterstrich wird die Methode deklariert als private Methoden in der Klasse von außen nicht aufrufen können. Anrufe selbst .__ private_methods innerhalb der Klasse

Beispiele

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class JustCounter:
	__secretCount = 0  # 私有变量
	publicCount = 0    # 公开变量

	def count(self):
		self.__secretCount += 1
		self.publicCount += 1
		print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount  # 报错,实例不能访问私有变量

Python durch den Namen zu ändern, den Namen der Klasse zu gehören:

1
2
2
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print counter.__secretCount  # 报错,实例不能访问私有变量
AttributeError: JustCounter instance has no attribute '__secretCount'

Python ist nicht instanzierten Klasse Zugriff privaten Daten erlaubt, aber Sie können object._className__attrName Zugriffsattribute verwenden, wird der folgende Code wird die letzte Zeile des Codes über dem Code ersetzen:

.........................
print counter._JustCounter__secretCount

Führen Sie den Code oben, Ausführung Ergebnisse sind wie folgt:

1
2
2
2