Latest web development tutorials

объектно-ориентированный Python

Python был разработан с самого начала является объектно-ориентированный язык, и как таковой, создать класс и объекты в Python очень легко. В этом разделе мы будем подробно объектно-ориентированное программирование на языке Python.

Если вы не были подвержены объектно-ориентированный язык программирования, то вам, возможно, придется сначала понять некоторые из основных особенностей объектно-ориентированных языков, сформированных в сознании внутри базовой концепции объектно-ориентированного, который поможет вам легко узнать Python объектно-ориентированное программирование.

Далее, давайте рассмотрим простой понимание объектно-ориентированных под некоторыми основными функциями.


Объектно-ориентированной технологии Обзор

  • Класс (класс): используется для описания коллекции имеют те же свойства и методы объектов. Он определяет набор свойств и методов, общих для каждого объекта. Объекты являются экземплярами классов.
  • Класс: переменные переменные класса является общим по всему инстанцирован объекта. Переменные класса определены и вне функции в классе в. Переменные класса обычно не используются в качестве переменных экземпляра.
  • Члены данных: переменные класса или переменные экземпляра для соответствующих классов обработки данных и объектов экземпляра.
  • Переопределения: Если вы не можете удовлетворить потребности подкласса наследует от метода родительского класса, он может быть переписан, этот процесс называется метод наложения (переопределение), также известный как метод наиважнейшей.
  • Примеры переменных: переменные , определенные в методе, только роль класса текущего экземпляра.
  • Наследование: То есть производный класс (производный класс) наследует (базовый класс) поля и методы базового класса. Наследование также позволяет производный объект класса в качестве объекта лечения базового класса. Например, есть такая конструкция: тип объекта, который является производным от класса собак животных, который является аналогом "представляет собой (это-а)" отношения (рис пример, собака для животных).
  • Инстанцировать: создать экземпляр класса, конкретного класса объектов.
  • Методы: Функции класса определены.
  • Объект: структура данных экземпляра с помощью определения класса. Объекты данных включают в себя два члена (класс и переменные экземпляра) и методы.

Создать класс

Используйте оператор класса, чтобы создать новый класс, после того, как класс, а имя класса заканчивается двоеточием, следующими примерами:

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

Помощь класса можно просмотреть ClassName .__ doc__.

class_suite состоит из членов класса, метода, атрибуты данных.

примеров

Ниже приведен простой экземпляр класса Python:

#!/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 является переменной класса, его значение будет разделена между всеми экземплярами этого класса. Вы можете использовать доступ Employee.empCount внутри класса или за пределами класса.
  • Метод первый метод __init __ () является методом специального метода, конструктора или инициализации класса вызывается при создании экземпляра этого класса будет вызывать метод

Создать экземпляр объекта

Чтобы создать экземпляр класса, вы можете использовать имя класса, а также принимать параметры __init__ метод.

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

Свойства доступа

Вы можете использовать точку (.) Свойство для доступа к объекту. Доступ к переменной класса с именем класса следующим образом:

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

Полный пример:

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

Выполнить код выше вывода результатов заключаются в следующем:

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

Вы можете добавлять, удалять, изменять свойства класса следующим образом:

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

Вы также можете получить доступ к свойствам использовать следующие функции:

  • GetAttr (объект, имя [, по умолчанию]): доступ к объектам недвижимости.
  • hasattr (объект, имя): Проверьте, есть ли атрибут.
  • SetAttr (объект, имя, значение): установить свойство. Если свойство не существует, создать новое свойство.
  • delattr (объект, имя): удалить атрибуты.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

Python встроенный атрибут класса

  • __dict__: Атрибуты класса (в том числе словаря, данные атрибута класса композиции)
  • __doc__: класс строка документа
  • __name__: имя класса
  • __module__: модуль, где определение класса (полное имя '. __main __ Classname', если класс находится в импортируемом модуле MyMod, то Classname .__ module__ равна MyMod)
  • __bases__: Все классы родительского элемента (содержащие родительский класс, состоящий из всех кортежей)

Python называет встроенные примеры атрибута класса являются следующие:

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

Выполнить код выше вывода результатов заключаются в следующем:

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

объект питона уничтожается (вывоз мусора)

Как и на языке Java, Python использует подсчет ссылок эту простую технику для отслеживания объектов в памяти.

В Python внутренней записи всех объектов, используя соответствующие номера ссылок.

Внутренней переменных отслеживания, называется счетчик ссылок.

Когда объект создан, он создает счетчик ссылок, когда объект больше не нужен, то есть сказать, ссылка на графу объекта становится равным 0, то сбор мусора. Но восстановление не "немедленно" интерпретатором в соответствующее время, объекты мусора занимают рекультивацию пространство памяти.

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

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

Механизм сбора мусора не только для эталонного объекта графа равен 0, то же самое можно также обрабатывать случай циклических ссылок. Это относится к циклической ссылке, два объекта не ссылаются друг на друга, но никаких других ссылок на переменные их. В этом случае, только счетчик ссылок недостаточно. сборщик мусора Python является на самом деле ссылка на счетчик цикла и сборщик мусора. В качестве дополнительного подсчета ссылок сборщик мусора будет обращать внимание на общую сумму выделяются большие объекты (а не считая уничтоженных в качестве ссылки). В этом случае интерпретатор сделает паузу, пытаясь очистить весь цикл без ссылок.

примеров

Деструктор __del__, __ del__ не вызывается, когда объект уничтожается, когда объект больше не используется, __ метод del__ для запуска:

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

Примеры приведенных выше результатов заключаются в следующем:

3083401324 3083401324 3083401324
Point 销毁

Примечание: Обычно вам нужно определить класс в отдельном файле,

наследование классов

Одним из основных преимуществ объектно-ориентированного программирования приводится повторное использование повторное использование кода для достижения одной из них через механизм наследования. Наследуется вполне объяснимое типа и подтипа отношения между классами в.

Оговорка: Наследование Синтаксис класс , производный имя класса (имя базового класса): // ... написав имя базового класса в скобках, когда базовый класс является определение класса, в том числе кортежей указанных.

В Python последовательности некоторые особенности:

  • 1: В следующей конфигурации (метод __init __ ()) Cheng Zhongji класс не будет вызываться автоматически, она требует специальных лично звонил в конструкторе его производного класса.
  • 2: При вызове метода базового класса, вам нужно добавить имя класса префикс базового класса, а также необходимость приведения переменных параметров самостоятельно. Не нужно принести параметр самость отличается от обычного вызова функции в классе
  • 3: Python всегда сначала найти соответствующий тип подхода, если он не может найти соответствующий метод в производном классе, он начал смотреть один за другим к базовому классу. (Первый метод вызывает, чтобы найти в этом классе, только чтобы найти, чтобы найти базовый класс).

Если столбец более одного класса в наследство кортежа, то она называется "множественное наследование".

Синтаксис:

Декларация производного класса, подобно их родительский класс, то наследуют список базового класса с именем класса, следующим образом:

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

Пример:

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

Приведенный выше код выполняется следующим образом:

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

Вы можете наследовать несколько классов

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

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

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

Вы можете использовать issubclass () или метод isinstance () для обнаружения.

  • issubclass () - булева функция, чтобы определить, является ли класс является подклассом другого класса или синтаксиса потомок класса: issubclass (суб, SUP)
  • isinstance (объект, класс) Булева функция, если OBJ является экземпляром объекта класса класса объекта класса или экземпляра является подкласс возвращает истину.

метод переопределяет

Если функция вы метод родительского класса не может удовлетворить ваши потребности, вы можете переписать метод родительского класса в подклассе:

Пример:

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

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

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

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

Выполнить код выше вывода результатов заключаются в следующем:

调用子类方法

Фонд перегруженные методы

В следующей таблице перечислены некоторые из общих функций, которые вы можете переопределить в классе:

Нет. Метод, описывается просто вызовите &
1 __init__ (само [, арг ...] )
Просто вызовитеметод конструктора:OBJ = Classname (арг)
2 __del __ (Я)
Деструкторы, удалить объект простойвызов метода:Dell OBJ
3 __repr __ (Я)
Преобразование формы для интерпретатора , чтобы прочитать простойвызов метода:магнезии (OBJ)
4 __str __ (Я)
Для получения значения в форме , пригодной для человеческого чтения простой методвызова:Str (OBJ)
5 __cmp__ (я, х)
Объект относительно простой методвызова:CMP (OBJ, х)

Оператор Перегрузки

Python также поддерживает перегрузку операторов, примеры являются следующие:

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

Результаты выполнения приведенного выше кода заключаются в следующем:

Vector(7,8)

Атрибуты класса и методы

Частный класс недвижимости

__private_attrs: начиная с двух символов подчеркивания , заявляющие , что собственность является частной и не могут быть использованы или доступны непосредственно в классе извне. Самостоятельно .__ private_attrs при использовании в качестве метода класса.

методы класса

В земном интерьере, используйте Защиту ключевое слово может быть определен как метод класса с общим определением различных функций, методы класса должны включать в себя параметр, и в качестве первого параметра

Частные методы класса

__private_method: первые два подчеркивание, метод объявлен как частные методы в классе не может вызывать извне. Вызывает чувство собственного .__ private_methods в классе

примеров

#!/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, изменив имя, чтобы включить имя класса:

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 не имеет доступа проиллюстрированный класс личные данные, но вы можете использовать атрибуты доступа object._className__attrName, следующий код будет заменить последнюю строку кода над кодом:

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

Выполнить код выше, результаты выполнения следующим образом:

1
2
2
2