Latest web development tutorials

Python3 orientada 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.

Y otros lenguajes de programación, Python en un mínimo de nueva sintaxis y la semántica de la situación a unirse al mecanismo de la clase.

clases de Python en la programación orientada a objetos proporciona todas las funciones básicas: el mecanismo de herencia de clases permite múltiples clases base, la clase base en las clases derivadas pueden sustituir algún método, se puede llamar al método de la clase base del mismo nombre.

Los objetos pueden contener cualquier número y tipo de datos.

definición de clase

Sintaxis es la siguiente:

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

Después se crea una instancia de la clase, puede utilizar sus propiedades, de hecho, después de crear una clase, puede acceder a sus propiedades a través del nombre de la clase.

objeto de la clase

objetos clase soportan dos tipos de operaciones: referencias de atributos y de creación de instancias.

Las referencias a atributos utilizan Python para todos atributo hace referencia a lasintaxis estándar: obj.name.

Después de la clase de objeto se creó atributo de espacio de nombres de clases todos los nombres son nombres válidos. Por lo tanto, si la definición de clase era la siguiente:

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

Instancia de la clase:

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

Anterior crea una nueva instancia de la clase y asigna este objeto a la variable local x, x objeto vacío.

La salida del programa anterior es:

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

Muchas clases les gusta crear objetos en un estado inicial conocido. Por lo tanto una clase puede definir un llamado __ __init () método especial (constructor), así:

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

Clase define __init __ () método, entonces el operador de instancias de clase llamará automáticamente método __init __ (). Así, en este ejemplo, puede ser la creación de una nueva instancia:

x = MyClass()

Por supuesto, el método __init __ () puede tener argumentos, parámetros __init __ () se pasa al operador de instancias de clase. Por ejemplo:

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

Los métodos de clase

En el interior terrestre, palabra clave def uso puede definirse como un método de clase, diferentes definiciones y funciones generales, métodos de clase deben incluir el mismo parámetro, y como primer parámetro:

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

La salida del programa anterior es:

w3big 说: 我 10 岁。

heredar

Python también soporta la herencia de clases, si una lengua no es compatible con la herencia, la clase tiene poco significado. Definición de la clase derivada de la siguiente manera:

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

Tenga en cuenta que el orden de la clase base paréntesis, si la clase base tiene el mismo nombre de método, pero sin especificar subclases, pitón de izquierda a derecha método de búsqueda que no se encuentra en la sub-clase, de izquierda a derecha para encontrar clase base contiene métodos.

BaseClassName (ejemplo de nombre de clase base) debe estar definido en un ámbito de la clase derivada. Además de las clases, puede utilizar la expresión, la clase base está definida en otro módulo, que es muy útil para:

class DerivedClassName(modname.BaseClassName):

Ejemplos

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

La salida del programa anterior es:

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

La herencia múltiple

Python soporta una forma limitada de herencia múltiple. definición de clase de herencia múltiple se ve de la siguiente manera:

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

Tenga en cuenta que el orden en la clase padre paréntesis, si la clase padre tiene el mismo nombre de método, pero sin especificar subclases, pitón de izquierda a derecha método de búsqueda que no se encuentra en la sub-clase, de izquierda a derecha para encontrar clase padre contiene métodos.

#!/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()   #方法名同,默认调用的是在括号中排前地父类的方法

La salida del programa anterior es:

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

sustituye el método

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

#!/usr/bin/python3

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

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

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

La salida del programa anterior es:

调用子类方法

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. slef llamada de clases interna .__ private_methods.

Ejemplos

instancia de la propiedad privada de la clase de la siguiente manera:

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

La salida del programa anterior es:

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'

Método privado instancia de la clase de la siguiente manera:

#!/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()      # 报错

Los resultados de los ejemplos anteriores:

métodos de propiedad de la clase:

  • __init__: se llama al constructor cuando se genera un objeto
  • __del__: destructor, los objetos de liberación
  • __repr__: impresión, conversión
  • __setitem__: de acuerdo con la asignación de los índices
  • __getitem__: Obtiene el valor del índice
  • __len__: obtener la longitud
  • __cmp__: operación de comparación
  • __call__: llamada a la función
  • __add__: añadir operación
  • __sub__: la resta
  • __mul__: la multiplicación
  • __div__: operación de división
  • __mod__: operador de resto
  • __pow__: la parte llamada

La sobrecarga de operadores

Python también soporta la sobrecarga de operadores, lo que se puede sobrecargar métodos propietarios de clase, los ejemplos son los siguientes:

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

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

Vector(7,8)