Latest web development tutorials

Python obiektowy

Python został zaprojektowany od samego początku jest językiem zorientowanym obiektowo, i jako takie, utworzyć klasy i obiekty w Pythonie jest bardzo proste. W tej sekcji będziemy szczegółowo programowania obiektowego w języku Python.

Jeśli nie zostały narażone na obiektowego języka programowania, to być może trzeba najpierw zrozumieć kilka podstawowych cech języków obiektowych, powstałych w umyśle wewnątrz podstawowej koncepcji obiektowego, co pozwala łatwiej nauczyć się Pythona programowania zorientowanego obiektowo.

Następnie weźmy prosty zrozumienia obiektowego w pewnych podstawowych funkcji.


Obiektowe Przegląd technologii

  • (Klasa) stosowane do opisu kolekcji mają takie same właściwości i metody obiektów. To definiuje zestaw właściwości i metod wspólnych dla każdego obiektu. Obiekty są instancjami klas.
  • Zmienne Klasa: zmienne klasy jest powszechne na całym instancja obiektu. Zmienne klasy zdefiniowane i na zewnątrz funkcji w klasie w. Zmienne klasy nie zwykle używane jako zmienne instancji.
  • Członkowie danych: zmienne klasy lub zmiennych instancji dla klas związanych z przetwarzaniem danych i instancji obiektów.
  • Zastępuje: Jeśli nie można zaspokoić potrzeby podklasa dziedziczy metody klasy nadrzędnej, to może być zapisane, a proces zwany metodą nakładki (override), znany również jako metoda nadrzędnego.
  • Przykłady zmiennych: zmienne zdefiniowane w metodzie, tylko rola klasy bieżącej instancji.
  • Dziedziczenie: To jest klasa pochodna (klasa pochodna) dziedziczy klasa podstawowa (klasy bazowej) pól i metod. Dziedziczenie umożliwia także pochodnej klasy jako obiekt klasy bazowej obiektu leczeniu. Na przykład, taka konstrukcja: typ obiektu, który pochodzi z klasy psów zwierzęcia, które jest analogiem "oznacza (is-a)" związek (przykład fig, jest pies zwierząt).
  • Wystąpienia: utworzyć instancję klasy, konkretnej klasy obiektów.
  • Metody: Funkcje klasy zdefiniowane.
  • Object: Dane struktury przykład poprzez definicji klasy. Obiekty danych obejmują dwa elementy (class i wystąpień zmiennych) i metod.

Tworzenie klasy

Użyj oświadczenie klasy, aby utworzyć nową klasę, po zajęciach, a nazwa klasy kończy się dwukropkiem, następujące przykłady:

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

Klasa Pomoc może być postrzegana przez ClassName .__ doc__.

class_suite złożona z członków klasy, metody, dane atrybutów.

Przykłady

Poniżej znajduje się prosty instancji klasy Pythona:

#!/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
  • Zmienna empCount jest zmienną klasy, jego wartość zostanie podzielone pomiędzy wszystkich wystąpień tej klasy. Można użyć dostępu Employee.empCount obrębie klasy lub klasy zewnętrznej.
  • Metoda pierwsza metoda __init __ () jest metodą specjalną metodę, konstruktor, lub inicjalizacji klasy jest wywoływana podczas tworzenia instancji tej klasy będzie wywołać metodę

Utwórz instancję obiektu

Aby utworzyć instancję klasy, można użyć nazwy klasy i zaakceptować metodę parameters __init__.

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

Właściwości dostępu

Możesz użyć kropki (.) obiekt, aby uzyskać dostęp do obiektu. Dostęp do zmiennej klasy z nazwą klasy w następujący sposób:

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

Kompletny przykład:

#!/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

Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:

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

Można dodawać, usuwać, modyfikować właściwości klasy, co następuje:

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

Można również uzyskać dostęp do właściwości korzystać z następujących funkcji:

  • getattr (obj, nazwa [domyślnie]): obiekty dostępu własności.
  • hasattr (obj, nazwa): Sprawdź, czy nie jest atrybutem.
  • setattr (obj, nazwa, wartość): ustawić właściwość. Jeżeli nieruchomość nie istnieje, utwórz nową właściwość.
  • delattr (obj, nazwa): usuwanie atrybutów.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

Python atrybutem klasy wbudowanych

  • __dict__: atrybuty klasy (w tym słowniku, przypisują dane skład klasy)
  • __doc__: Klasa ciąg dokumentu
  • __name__: nazwa klasy
  • __module__: Moduł gdzie definicja klasy (pełna nazwa ". __main __ className", jeśli klasa znajduje się w importowanego modułu MyMod, potem className .__ module__ równa MyMod)
  • __bases__: Wszystkie klasy elementu nadrzędnego (zawierające klasę nadrzędną zawierającą wszystkie krotki)

Python wywoła wbudowany w przykładach atrybutów klasy są następujące:

#!/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__

Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:

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>}

Obiekt python jest zniszczona (garbage collection)

Podobnie jak w języku Java, Python używa licznik odniesień Ta prosta technika śledzenia obiektów w pamięci.

W rekordzie wewnętrznego Python wszystkich obiektów wykorzystujących odpowiednie numery odniesień.

Wewnętrzny zmienne śledzenia, zwany licznik odniesienia.

Gdy obiekt jest utworzony tworzy liczbę odniesienia, gdy przedmiot nie jest już potrzebny, to znaczy, odniesienie do liczby przedmiotów staje się 0, to jest zbierane śmieci. Ale odzyskanie nie jest "natychmiast" przez interpreter w odpowiednim czasie, obiekty śmieci zajmują przestrzeń pamięci rekultywacji.

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

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

Mechanizm zbierania śmieci nie tylko do zliczania odniesienia przedmiot jest 0, to samo można również obsługiwać przypadek odniesień kołowych. Odnosi się do okrągłej odniesienia dwa przedmioty znajdują się siebie nawzajem, ale nie inne zmienne odniesienia im. W tym przypadku tylko licznik odwołań nie wystarczy. garbage collector Pythona jest rzeczywiście odniesienie do licznika cykli i śmieciarza. Jako dodatkowy element odniesienia liczenia garbage collector będzie zwracać uwagę na łączną kwotę przeznaczono duże obiekty (nie licząc tych zniszczonych przez odniesienie). W tym przypadku, interpreter zatrzyma się, próbując oczyścić cały cykl bez numeru referencyjnego.

Przykłady

Destructor __del__, __ del__ jest wywoływana, gdy obiekt zostanie zniszczony, gdy obiekt nie jest już używany, __ metodę del__ uruchomić:

#!/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

Przykłady powyższe wyniki przedstawiają się następująco:

3083401324 3083401324 3083401324
Point 销毁

Uwaga: Zazwyczaj trzeba zdefiniować klasę w oddzielnym pliku,

Klasa dziedziczenie

Jedną z głównych korzyści wynikających z programowania obiektowego doprowadza do ponownego użycia ponowne wykorzystanie kodu, aby osiągnąć jeden z nich jest za pomocą mechanizmu dziedziczenia. Dziedziczone całkowicie zrozumiałe typu i podtypu relacje między klasami do.

Zastrzeżenie: Dziedziczenie Składnia klasa pochodzi nazwa klasy (nazwa klasy bazowej): // ... pisząc nazwę klasy bazowej w nawiasach, gdy klasa bazowa jest definicja klasy, między określonymi krotki.

W Pythonie dziedziczenia niektórych cech:

  • 1: W następującej konfiguracji (metoda __init __ ()) Klasa Cheng Zhongji nie zostanie automatycznie wywoływana, to wymaga specjalistycznej osobiście nazywany w konstruktorze klasy pochodnej jej.
  • 2: Podczas wywoływania metody klasy bazowej, trzeba dodać przedrostek nazwy klasy do klasy podstawowej i potrzebę doprowadzenia zmiennych parametrów siebie. Nie trzeba przynieść własny parametr różni się od zwykłego wywołania funkcji w klasie
  • 3: Python zawsze najpierw znaleźć odpowiedni rodzaj podejścia, jeśli nie może znaleźć odpowiednią metodę w klasie pochodnej, zaczął szukać pojedynczo do klasy bazowej. (Pierwsza metoda wymaga, aby znaleźć się w tej klasie, aby znaleźć się znaleźć klasę bazową).

Jeśli kolumna więcej niż jedna klasa w krotce spadkowego, to nazywa się "wielokrotne dziedziczenie".

Składnia:

Deklaracja klasy pochodnej, podobnie jak ich klasy nadrzędnej, to dziedziczą klasy bazowej listy z nazwą klasy, w następujący sposób:

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

Przykład:

#!/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()          # 再次调用父类的方法

Powyższy kod jest wykonywany w następujący sposób:

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

Można odziedziczyć wiele klas

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

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

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

Można użyć issubclass () lub metodę isinstance () w celu wykrycia.

  • issubclass () - funkcja logiczna celu ustalenia, czy dana klasa jest podklasą innej klasy lub potomka składni klasy: issubclass (sub, sup)
  • isinstance (obj, Class) Funkcja logiczna, jeśli obj jest instancją klasy obiektu lub instancji obiektu klasy klasa jest podklasą zwraca true.

metoda nadpisania

Jeśli funkcja jesteś metoda klasy rodzic nie może zaspokoić swoich potrzeb, można przepisać swoją nadrzędną klasy metody w podklasie:

Przykład:

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

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

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

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

Wykonanie powyższego kodu wyniki wyjściowe są w następujący sposób:

调用子类方法

Fundacja przeciążone metody

W poniższej tabeli przedstawiono niektóre z typowych cech, które można przesłonić w swojej klasie:

Nie. Metoda opisana po prostu zadzwonić i
1 __init__ (self [, args ...] )
Wystarczy zadzwonić dokonstruktora:obj = className (args)
2 __del __ (self)
Destruktory, usunąć obiekt prosta metodapołączenia:dell OBJ
3 __repr __ (self)
Przekształcenie formy dla tłumacza czytać prostą metodępołączenia:repr (obj)
4 __str __ (self)
Dla wartości w postaci nadającej się do ludzkiego czytania prosta metodapołączenia:str (obj)
5 __cmp__ (self, x)
Object metoda stosunkowo prostepołączenie:cmp (obj, x)

operator Przeciążenie

Pyton obsługuje przeciążenie operatora przykłady są następujące:

#!/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

Wyniki wykonania, powyższy kod są następujące:

Vector(7,8)

atrybuty i metody klasy

Prywatna klasa własności

__private_attrs: zaczynając dwa podkreślenia stwierdzające, że nieruchomość jest prywatny i nie mogą być używane lub dostępne bezpośrednio w klasie zewnętrznie. Self .__ private_attrs kiedy jest stosowany w metodzie klasy.

metody klas

We wnętrzu naziemnej kluczowe zastosowanie def może być zdefiniowana jako metoda z klasy ogólnej definicji różnych funkcji, metody klasie musi zawierać siebie parametru, jak i pierwszy parametr

Metody prywatnych klasy

__private_method: pierwsze dwa podkreślenia, metoda jest zadeklarowana jako metody prywatne w klasie nie może dzwonić na zewnątrz. Wywoła self .__ private_methods w klasie

Przykłady

#!/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, zmieniając nazwę na zawierać nazwę klasy:

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 nie jest dozwolone Dostęp instancja klasy prywatne dane, ale można użyć atrybutów dostępu object._className__attrName poniższy kod zastąpi ostatnią linię kodu powyższego kodu:

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

Wykonać powyższy kod, wyniki wykonania są następujące:

1
2
2
2