Latest web development tutorials

Python orientado a objetos

Python ha sido diseñado desde el principio es un lenguaje orientado a objetos, y como tal, crear una clase y objetos en Python es muy fácil. En esta sección vamos a detallar la programación orientada a objetos en Python.

Si usted no ha estado expuesto a la orientada a objetos lenguaje de programación, entonces puede que tenga que entender primero algunas de las características básicas de los lenguajes orientados a objetos, formados en la mente dentro de un concepto básico de la orientada a objetos, lo que le ayuda a aprender más fácilmente el pitón la programación orientada a objetos.

A continuación, vamos a echar un simple comprensión de bajo algunas características básicas orientada a objetos.


Descripción general de Tecnología Orientada a Objetos

  • Clase (Class): se utiliza para describir la colección tienen las mismas propiedades y métodos de los objetos. Se define un conjunto de propiedades y métodos comunes a cada objeto. Los objetos son instancias de clases.
  • Las variables de clase: las variables de clase es común en todo el objeto instanciado. Las variables de clase definidos y fuera de la función de la clase en. Las variables de clase no suelen utilizarse como variables de instancia.
  • Miembros de datos: variables de clase o variables de instancia para las clases de procesamiento de datos asociados y los objetos instancia.
  • Anulaciones: Si no puede satisfacer las necesidades de una subclase hereda del método de la clase padre, puede ser reescrito, un proceso llamado método de superposición (anulación), también conocido como el método de alteración temporal.
  • Ejemplos de variables: variables definidas en el método, sólo el papel de la clase de la instancia actual.
  • Herencia: Esto es una clase derivada (clase derivada) hereda la clase base () campos y métodos de la clase base. La herencia también permite a un objeto de clase derivada como un objeto de placer clase base. Por ejemplo, hay un diseño de este tipo: un tipo de objeto que se deriva de una clase de Animal Perro, que es un análogo "es una (es-a)" relación (Fig ejemplo, es un Animal Perro).
  • Instanciar: crear una instancia de una clase, la clase de objeto específico.
  • Métodos: Las funciones definidas en su clase.
  • Objeto: los datos de instancia de estructura a través de la definición de clase. Los objetos de datos incluyen dos miembros (variables de clase e instancia) y métodos.

crear clase

Utilice la instrucción de clase para crear una nueva clase, después de clase, y el nombre de la clase termina con dos puntos, los siguientes ejemplos:

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

clase de ayuda puede ser visto por NombredeClase .__ doc__.

class_suite compuesto por miembros de la clase, método, los atributos de los datos.

Ejemplos

El siguiente es un simple instancia de clase 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 variables es una variable de clase, su valor se repartirá entre todas las instancias de esta clase. Usted puede utilizar el acceso Employee.empCount dentro de la clase o fuera de clase.
  • El método primer método __init __ () es un método método especial, constructor o inicialización de clase se llama cuando se crea una instancia de esta clase se llama al método

Crear una instancia de un objeto

Para crear una instancia de una clase, puede utilizar el nombre de la clase, y aceptar los parámetros método __init__.

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

Propiedades de acceso

Se puede utilizar el punto (.) La propiedad para acceder al objeto. Acceso a una variable de clase con el nombre de la clase de la siguiente manera:

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

Ejemplo completo:

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

Ejecutar el código anterior resultados de salida son los siguientes:

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

Puede añadir, borrar, modificar las propiedades de la clase de la siguiente manera:

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

También puede acceder a las propiedades utilizan las siguientes funciones:

  • getattr (obj, nombre [, default]): acceso a objetos de la propiedad.
  • hasattr (obj, nombre): Compruebe si hay un atributo.
  • setattr (obj, nombre, valor): establece una propiedad. Si no existe la propiedad, crear una nueva propiedad.
  • delattr (obj, nombre): eliminar atributos.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

Python atributo de clase incorporada

  • __dict__: atributos de la clase (incluyendo un diccionario, el atributo de datos composición de clase)
  • __doc__: clase string documento
  • __name__: nombre de la clase
  • __module__: módulo en el que la definición de clase (el nombre completo es '. __main __ className', si la clase está situado en una mimodelo módulo importado, entonces className .__ module__ igual mimodelo)
  • y__bases__: Todas las clases de elemento padre (que comprenden una clase padre que consiste en todas las tuplas)

Python llama a la incorporada en ejemplos de atributos de clase son los siguientes:

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

Ejecutar el código anterior resultados de salida son los siguientes:

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

objeto de Python se destruye (recolección de basura)

Al igual que el lenguaje Java, Python utiliza la referencia de contar esta técnica sencilla de realizar un seguimiento de objetos en memoria.

En Python registro interno de todos los objetos que utilizan los números respectivos de referencias.

Un variables de seguimiento internos, llamado contador de referencia.

Cuando se crea un objeto, se crea una cuenta de referencia, cuando el objeto ya no es necesario, es decir, una referencia al contador de objetos se 0, es basura recogida. Sin embargo, la recuperación no es "inmediatamente" por el intérprete en el momento apropiado, los objetos de basura ocupan memoria de recuperación de espacio.

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

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

mecanismo de recolección de basura no sólo por el número de referencia de objeto es 0, el mismo también puede manejar el caso de las referencias circulares. Se refiere a una referencia circular, dos objetos se refieren el uno al otro, pero no hay otras referencias a variables ellos. En este caso, sólo la cuenta de referencia no es suficiente. recolector de basura de Python es en realidad una referencia a un contador de ciclos y el recolector de basura. Como recolector de basura recuento de referencias adicionales en lo que prestar atención a la cantidad total asignada objetos grandes (y sin contar las que fueron destruidas por referencia). En este caso, el intérprete hará una pausa, tratando de limpiar todo el ciclo sin referencias.

Ejemplos

Destructor __del__, __ del__ se llama cuando se destruye el objeto, cuando el objeto ya no está siendo utilizado, __ método del__ para funcionar:

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

Los ejemplos de los resultados anteriores son como sigue:

3083401324 3083401324 3083401324
Point 销毁

Nota: Por lo general, es necesario definir una clase en un archivo separado,

la herencia de clases

Uno de los principales beneficios de la programación orientada a objetos es traído a reutilizar la reutilización de código para lograr una de ellas es a través del mecanismo de herencia. Heredada totalmente comprensible la relación entre tipo y subtipo clases en.

Advertencia: La herencia de clases de sintaxis nombre de la clase derivada (el nombre de la clase base): // ... escribir el nombre de la clase de base entre paréntesis, cuando la clase base es la definición de clase, entre tuplas especificados.

En la sucesión pitón de algunas de las características:

  • 1: En la siguiente configuración (método __init __ ()) Clase de Cheng Zhongji no sean invocados de forma automática, se requiere personal especializado llamado en el constructor de su clase derivada.
  • 2: Cuando se llama al método de la clase base, es necesario agregar el nombre de la clase prefijo de la clase base, y la necesidad de llevar variables de parámetros auto. No necesita traer parámetro auto es diferente de la llamada a la función normal de la clase
  • 3: Python siempre en primer lugar encontrar el tipo correspondiente de enfoque, si no puede encontrar el correspondiente método en una clase derivada, que comenzaron a buscar uno por uno a la clase base. (Primer método llama a encontrar en esta clase, sólo para encontrar que encontrar la clase base).

Si la columna de más de una clase en la tupla herencia, entonces se le llama "la herencia múltiple."

sintaxis:

Declaración de la clase derivada, similar a su clase padre, entonces heredan la lista de la clase base con el nombre de la clase, de la siguiente manera:

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

Ejemplo:

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

El código de seguridad se ejecuta como sigue:

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

Se puede heredar de múltiples clases

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

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

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

Puede utilizar el método isinstance () issubclass () o de detectar.

  • issubclass () - función booleana para determinar si una clase es una subclase de otra clase o clase descendiente de sintaxis: issubclass (sub, sup)
  • isinstance (obj, Clase) función booleana si obj es una instancia de una clase de la clase de objeto de clase de objeto o instancia es una subclase devuelve verdadero.

sustituye el método

Si la función de usted es el método de la clase padre no puede satisfacer sus necesidades, puede volver a escribir el método de la clase padre en una subclase:

Ejemplo:

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

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

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

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

Ejecutar el código anterior resultados de salida son los siguientes:

调用子类方法

Fundación métodos sobrecargados

La siguiente tabla muestra algunas de las características comunes que se pueden anular en su clase:

No. El método, que se describe simplemente llamar y
1 __init__ (auto [args ...] )
Basta con llamar almétodo constructor:obj = className (args)
2 __del __ (self)
Destructores, eliminar un objeto simplellamada al método:dell obj
3 __repr __ (self)
La conversión de la forma que el intérprete leer una simplellamadademétodo:repr (obj)
4 __str __ (self)
Para el valor en una forma adecuada para la lectura humana una simplellamada método:str (obj)
5 __cmp__ (self, x)
Objeto relativamente simplellamada al método:cmp (obj, x)

La sobrecarga de operadores

Python también soporta la sobrecarga de operadores, los ejemplos son los siguientes:

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

Los resultados de la ejecución de código de arriba son los siguientes:

Vector(7,8)

atributos y métodos de la clase

clase de propiedad privada

__private_attrs: a partir de dos guiones que indican que la propiedad es privada y no se puede usar ni acceder directamente en la clase externa. Self .__ private_attrs cuando se utilizan dentro de un método de clase.

Los métodos de clase

En el interior terrestre, palabra clave uso def se puede definir como un método de la clase con la definición general de las diferentes funciones, métodos de clase deben incluir el mismo parámetro, y como el primer parámetro

Los métodos privados de clase

__private_method: los dos primeros subrayado, el método se declara como métodos particulares en la clase no pueden llamar externamente. Las llamadas private_methods self .__ dentro de la clase

Ejemplos

#!/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 cambiando el nombre para incluir el nombre de la clase:

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 no se permite acceso de clase instanciada datos privados, pero se puede utilizar atributos de acceso object._className__attrName, el siguiente código sustituirá a la última línea de código en el código:

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

Ejecutar el código anterior, los resultados de ejecución son las siguientes:

1
2
2
2