Latest web development tutorials

Python3 Objektorientiertes

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.

Und andere Programmiersprachen Python bei einem Minimum an neuer Syntax und Semantik der Situation der Klasse Mechanismus beteiligen.

Python-Klassen in der objektorientierten Programmierung bietet alle grundlegenden Funktionen: der Klassenvererbungsmechanismus mehrere Basisklassen ermöglicht, kann die Basisklasse in abgeleiteten Klassen Methoden überschreiben möchten, können Sie rufen Sie die Basisklassenmethode mit dem gleichen Namen.

Objekte können eine beliebige Anzahl und Art von Daten enthalten.

Klassendefinition

Die Syntax ist wie folgt:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

Nachdem die Klasse instanziiert wird, können Sie seine Eigenschaften zu verwenden, in der Tat, nachdem Sie eine Klasse erstellen, können Sie seine Eigenschaften über den Klassennamen zugreifen.

Class-Objekt

Klassenobjekte unterstützen zwei Arten von Operationen: Attribut-Referenzen und Instanziierung.

Python Referenzen - Attribut für alle Attribut verweist auf dieStandardsyntax: obj.name.

Nachdem der Klassenobjekt alle Klassennamespace-Attribut erstellt wurde sind die Namen gültigen Namen. Also, wenn die Klassendefinition sah wie folgt aus:

#!/usr/bin/python3

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

Instanziieren Sie die Klasse:

# 实例化类
x = MyClass()
# 访问类的属性和方法

Vor erstellt eine neue Instanz der Klasse und weist dieses Objekt der lokalen Variablen x, leeres Objekt x.

Das obige Programm Ausgabe lautet:

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

Viele Klassen wie Objekte in einem bekannten Anfangszustand zu schaffen. Daher ist eine Klasse kann eine benannte __init __ () spezielle Methode (Konstruktor), wie folgt definieren:

def __init__(self):
    self.data = []

Klasse definiert __init __ () -Methode, dann die Klasse Instanziierung Operator automatisch aufrufen __init __ () -Methode. So in diesem Beispiel kann es sein, eine neue Instanz zu erstellen:

x = MyClass()

Natürlich __init __ () Methode Argumente haben kann, Parameter __init __ () der Klasse Instanziierung Betreiber übergeben wird. Zum Beispiel:

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

Klassenmethoden

Im terrestrischen Innenraum kann die Verwendung Schlüsselwort def als Klassenmethode, unterschiedliche Definitionen und allgemeine Funktionen definiert werden, müssen Klassenmethoden umfassen die Parameter selbst, und als ersten Parameter:

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('w3big',10,30)
p.speak()

Das obige Programm Ausgabe lautet:

w3big 说: 我 10 岁。

ererben

Python unterstützt auch Klassenvererbung, wenn eine Sprache keine Vererbung unterstützt, die Klasse wenig Bedeutung hat. Definition der Klasse wie folgt abgeleitet:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

Beachten Sie, dass die Reihenfolge der Basisklasse in Klammern, wenn die Basisklasse hat die gleiche Methode Namen, aber ohne Unterklassen, Python von links nach rechts Suchmethode, der nicht in der Unterklasse zu finden ist, von links nach rechts zu finden Basisklasse enthält Methoden.

Baseclass (Beispiel Basisklassenname) muss in einer abgeleiteten Klasse Umfang definiert werden. Zusätzlich zu den Klassen, man den Ausdruck verwenden können, ist die Basisklasse in einem anderen Modul definiert ist, die für sehr nützlich ist:

class DerivedClassName(modname.BaseClassName):

Beispiele

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))



s = student('ken',10,60,3)
s.speak()

Das obige Programm Ausgabe lautet:

ken 说: 我 10 岁了,我在读 3 年级

Mehrfachvererbung

Python unterstützt eine begrenzte Form von Mehrfachvererbung. Mehrfachvererbung Klassendefinition sieht wie folgt aus:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

Beachten Sie, dass die Reihenfolge, in Klammern übergeordneten Klasse, wenn die Elternklasse haben die gleiche Methode Namen, aber ohne Unterklassen, Python von links nach rechts Suchmethode, der nicht in der Unterklasse zu finden ist, von links nach rechts zu finden Eltern-Klasse enthält Methoden.

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

#另一个类,多重继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

#多重继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法

Das obige Programm Ausgabe lautet:

我叫 Tim,我是一个演说家,我演讲的主题是 Python

Methode überschreibt

Wenn die Funktion, die Sie die übergeordnete Klasse Methode sind, können Sie Ihre Anforderungen nicht erfüllen, können Sie Ihre Eltern-Klasse-Methode in einer Unterklasse neu schreiben können, sind Beispiele, wie folgt:

#!/usr/bin/python3

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

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

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

Das obige Programm Ausgabe lautet:

调用子类方法

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. Interne Klasse Anruf slef .__ private_methods.

Beispiele

Privatbesitz Instanz der Klasse wie folgt:

#!/usr/bin/python3

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)  # 报错,实例不能访问私有变量

Das obige Programm Ausgabe lautet:

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

Private Methode Instanz der Klasse wie folgt:

#!/usr/bin/python3

class Site:
	def __init__(self, name, url):
		self.name = name       # public
		self.__url = url   # private

	def who(self):
		print('name  : ', self.name)
		print('url : ', self.__url)

	def __foo(self):          # 私有方法
		print('这是私有方法')

	def foo(self):            # 公共方法
		print('这是公共方法')
		self.__foo()

x = Site('本教程', 'www.w3big.com')
x.who()        # 正常输出
x.foo()        # 正常输出
x.__foo()      # 报错

Die Ergebnisse der obigen Beispiele:

Proprietäre Methoden der Klasse:

  • __init__: Konstruktor aufgerufen wird , wenn ein Objekt erzeugt wird
  • __del__: destructor, die Freigabeobjekte
  • __repr__: Druck, Umwandlung
  • __setitem__: nach der Index - Zuordnung
  • __getitem__: Ruft den Wert in Index
  • __len__: get Länge
  • __cmp__: Vergleichsoperation
  • __call__: Funktionsaufruf
  • __add__: Add - Operation
  • __sub__: Subtraktion
  • __mul__: Multiplikation
  • __div__: Divisionsoperation
  • __mod__: Rest Betreiber
  • __pow__: Angerufenen

Überladen von Operatoren

Python unterstützt auch Überladen von Operatoren, was ich Klasse proprietäre Methoden überlastet werden können, Beispiele sind wie folgt:

#!/usr/bin/python3

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)