De orden superior orientado a objetos Python - descriptores y patrones de diseño de aprendizaje # simios


 

 

## descriptor

> Cuando una clase contiene tres método mágico ( `__get __, __ __ conjunto, __ delete__`) uno o todo el tiempo, entonces esta clase se llama clase descriptor

### papel

> Descriptor es el papel de un miembro de una clase llevó a cabo una gestión detallada las operaciones (adquisición, cesión, borrado)

> Descriptor es el agente de una clase de los miembros de operación, perteneciente al descriptor de la clase, el atributo de clase se define únicamente

### tres métodos mágicos

`` `Python

'''

__get __ (self, ejemplo, propietario)

mecanismo de activación: cuando la propiedad de miembro objeto de acceso se activa automáticamente (cuando el miembro ha sido entregado a la gestión descriptor)

Papel: establecer el valor actual de la propiedad adquirida

Parámetros 1 :. mismo descriptor de objeto 2 administrado por los miembros de la clase de objeto. 3. La administración es un miembro de la clase

Devuelve: el valor de los bienes adquiridos como miembro de

Advertencias: Ninguna

__set __ (self, ejemplo, valor)

mecanismo de activación: Al establecer la propiedad de miembro objeto se activa automáticamente (cuando el miembro ha sido entregado a la gestión descriptor)

Rol: Para gestionar la asignación de miembros

Parámetros 1 :. mismo descriptor de objeto 2 administrado por los miembros de la clase de objeto. 3. El valor de engaste

Valor de retorno: Ninguno

Advertencias: Ninguna

__delete __ (self, ejemplo)

mecanismo de activación: Cuando se elimina un objeto miembro de la propiedad se activa automáticamente (cuando el miembro ha sido entregado a la gestión descriptor)

Función: propiedades de miembro de borrado se gestionan

Parámetros 1 :. mismo descriptor de objeto 2 administrado por los miembros de la clase de objeto.

Valor de retorno: Ninguno

Advertencias: Ninguna

'''

`` `

descriptor de datos completa :( ###)

> Métodos mágicos tienen clase descriptor de datos es de tres

### descriptor no datos :( incompleta)

> No hay métodos mágicos tienen tres clases de descriptor de la clase no se

### Formato de uso básico

> La clase de atributo descriptor actual asignado a un miembro de una clase de agentes requiere

Ejemplo de código:

`` `Python

# Definir clase descriptor

clase PersonName ():

    __name = 'abc'

    def __get __ (self, ejemplo, dueño):

        # Impresión (auto, ejemplo, propietario)

        de retorno automático .__ nombre

    def __set __ (self, ejemplo, valor):

        # Impresión (auto, ejemplo, valor)

        self .__ nombre = valor

    def __delete __ (self, ejemplo):

        # Impresión (auto, ejemplo)

        # Nombre del self .__

        imprimir ( 'no se pueden borrar')

# Definido en la categoría general

Clase Persona ():

    # Para un miembro de una clase de descriptor de atributos de clase para ser alcanzado

    # A valor del miembro de otra descripción de la clase del identificador de clase de objeto ()

    # A continuación, cuando los miembros de esta clase tienen que operar, se entiende que la operación a otro objeto

    name = PersonName ()

# Instancias de un objeto

zs = Persona ()

impresión (zs.name)

zs.name = 'John Doe'

impresión (zs.name)

del zs.name

impresión (zs.name)

`` `

Aplicación de descriptor analítico ###

`` `Python

# Definir una clase de los estudiantes, los estudiantes necesitan para registrar la identificación, nombre, puntuación

Estudiante de clase ():

    def __init __ (self, identificación, nombre, puntuación):

        self.id = id

        self.name = nombre

        self.score = puntuación

    def returnMe (self):

        info = f '''

        Número de Estudiantes: {} self.id

        Nombre del participante: {} self.name

        Puntuación estudiante: {} self.score

        '''

        impresión (info)

'''

# Requisitos: Los estudiantes sólo pueden puntajes en el rango 0-100

solución:

    1. Detectar una corriente en el rango de método anota __init__

        # puntuaciones de detección varían

        si la puntuación> = 0 y la puntuación <= 100:

            self.score = puntuación

        Esta solución sólo puede ser eficaz cuando se inicializa el objeto.

    2. Define un método de detección de magia setattr

        Si se detecta la asignación a los puntos de puntuación, la puntuación de determinación de detección

            def __setattr __ (self, clave, valor):

        # Detectar si la asignación es la puntuación

        si la clave == 'puntuación':

            # puntuaciones de detección varían

            si el valor de> = 0 y el valor <= 100:

                objeto .__ setattr __ (self, clave, valor)

            más:

                imprimir ( 'no cumple con la puntuación actual')

        más:

            objeto .__ setattr __ (self, clave, valor)

        Si los estudiantes no puntuarán más que cómo hacer un tiempo, como las puntuaciones de lenguaje, las calificaciones de matemáticas, las puntuaciones en Inglés

        El otro es el código actual es esta clase es más y más de ella?

    3. Pensar puede utilizar descriptores para representar nuestra puntuación para esta propiedad

        definiciones de clase descriptor 1. Marca

        2. Los estudiantes en la clase puntuación a los miembros de la clase proxy descriptor

        3. Siempre y cuando la asignación fraccional y el acceso al descriptor de la clase bien en las del mediador

'''

# Definir descriptor agente de administración puntuación de clase

Puntuación de clase ():

    def __get __ (self, ejemplo, dueño):

        de retorno automático .__ puntuación

    def __set __ (self, ejemplo, valor):

        si el valor de> = 0 y el valor <= 100:

            self .__ puntuación = valor

        más:

            imprimir ( 'puntuación no cumple con los requisitos')

# puntuaciones de atributos de clase Uso descriptor puntuación Agente

Estudiante de clase ():

    Puntuación = Puntuación ()

    def __init __ (self, identificación, nombre, puntuación):

        self.id = id

        self.name = nombre

        self.score = puntuación

    def returnMe (self):

        info = f '''

        Número de Estudiantes: {} self.id

        Nombre del participante: {} self.name

        Puntuación estudiante: {} self.score

        '''

        impresión (info)

# Instancias de un objeto

zs = Student (1011, 'Zhang loco', 99)

zs.returnMe ()

zs.score = -20

zs.score = 88

zs.returnMe ()

`` `

Descriptor ### define tres formatos

`` `Python

# Formato recomendado se logra mediante la definición de un descriptor de la clase

'''

clase ScoreManage ():

    def __get __ (self, ejemplo, dueño):

        pasar

    def __set __ (self, ejemplo, valor):

        pasar

    def __delete __ (self, ejemplo):

        pasar

Estudiante de clase ():

    puntuación = ScoreManage ()

'''

# Formato En segundo lugar, el uso de la función de propiedad para lograr

'''

Estudiante de clase ():

    # Directamente definen necesitan ser administrados en esta clase unos tres métodos similares

    def getScore (self):

        imprimir ( 'getScore')

    def setscore (self, valor):

        imprimir ( 'setscore', valor)

    def delscore (self):

        imprimir ( 'delscore')

    # Especificado en los tres métodos que corresponden a la función de la propiedad, un método correspondiente. __get __, 2. __set __, 3. __delete__

    Puntuación = propiedad (getScore, setscore, delscore)

zs = Student ()

# Impresión (zs.score)

# = 200 zs.score

# Del zs.score

'''

# Formato usando la sintaxis de decorador de tres @property para lograr

'''

Estudiante de clase ():

    __score = Ninguno

    @propiedad

    def anotar (auto):

        imprimir ( 'get')

        de retorno automático .__ puntuación

    @ score.setter

    def anotar (auto, valor):

        imprimir ( 'set')

        self .__ puntuación = valor

    @ score.deleter

    def anotar (auto):

        imprimir ( 'eliminar')

        del self .__ puntuación

zs = Student ()

# Impresión (zs.score)

zs.score = 199

impresión (zs.score)

del zs.score

'''

`` `

## patrones de diseño

> Modo de diseño es una característica o antes de la finalización de las necesidades humanas, basado en las experiencias y lecciones de los pasos y el código de diseño e implementación se resumen y se suman, se convierten en un requisito para alcanzar el modo clásico.

>

> Formato de código de patrón de diseño no es fijo, sino un diseño de la programación orientada a objetos

Ejemplo ### Individual (singlete) patrón de diseño

> En el script actual, la misma clase sólo puede crear un objeto de uso. Esta situación se vuelve Singleton (singlete).

`` `Python

'''

Caso único ejemplo, considere:

Singleton y relación de ley de matrimonio, especialmente en lo que una persona sólo puede tener un matrimonio

En la sociedad es cómo monógama completa?

Si quiere casarse, tiene que ir a la Oficina de Asuntos Civiles de registro

Oficina de Asuntos Civiles, dos personas necesitan para detectar cuenta de esto, para ver si el estado anterior del matrimonio

Si está casado, asegúrese de empuje hacia fuera.

Si usted no está casado, se puede construir un capítulo y comenzar el registro.

Pues bien, de acuerdo con esta línea de pensamiento sobre cómo lograr el patrón de diseño Singleton pitón en ella?

1. Usted necesita tener un camino a seguir para controlar el proceso de creación del objeto actual?

    __new__ constructor

2. Hay una necesidad de almacenar y la etiqueta que indica si hay un objeto

    Creación de una propiedad privada para el almacenamiento, el valor predeterminado Ninguno

3. En el proceso de creación de objetos para detectar y determinar si hay un objeto?

    Si usted no se opone, crear un objeto, y el objeto se almacena, devolver el objeto

    Si el almacenamiento es un objeto, devuelve el objeto directamente, no es necesario crear un nuevo objeto

'''

clase Demo ():

    # 2 definen los objetos almacenados atributos particulares, el valor predeterminado Ninguno

    __obj = Ninguno

    1. Definiciones constructor #

    def __new __ (CLS, * args, kwargs **):

        # 3. En el proceso de creación de un objeto, si hay o no un objeto

        si no cls .__ obj:

            # Juez si no hay ningún objeto, el objeto se crea y almacena

            cls .__ obj = objeto .__ nuevos __ (CLS)

        # Devuelve directamente al almacenamiento de objetos

        volver cls .__ obj

# Instancias de un objeto

a = Demo ()

b = Demo ()

impresión (a)

imprimir (b)

'''

<__ __ principal. Objeto de demostración en 0x106f4d850>

<__ __ principal. Objeto de demostración en 0x106f4d850>

'''

`` `

patrones de diseño mixto ### Mixin

clase #### Mixin

+ Mixin debe ser que representa una función, en lugar de un objeto.

+ Función Mixin debe ser sencillo, si hay múltiples funciones, sería la clase de Mixin más definido

+ Python en Mixin se logra a través de la herencia múltiple

+ Mixin esta clase normalmente no se utiliza solo, sino una mezcla de las otras clases, funciones para aumentar

+ Clase Mixin no depende de la subclase aplicación, incluso si el niño no hereda esta clase Mixin, una subclase se puede ejecutar correctamente, puede carecer de algunas características. .

#### beneficios del uso de la clase Mixin mixta?

El patrón de diseño 1. Mixin clase mixta, la clase no está en el contenido de la premisa modificado, amplía la funcionalidad de clase

2. Mixin tipo mixto con el fin de mejorar la reutilización de código, tal estructura de código simple, clara

puede necesitar ser ajustado de acuerdo con el desarrollo (la creación de una nueva clase mixta Mixin) para evitar la compleja herencia de diseño multi-nivel 3. función.

Ejemplo:

`` `Python

'''

Heredar la necesidad de un requisito previo necesario para la sucesión debe haber una relación entre el 'es-un' de

Por ejemplo:

    Apple puede ir a heredar los frutos, ya que Apple es una fruta

    Apple puede no hereda el almuerzo, el almuerzo porque no puede haber ninguna manzana

    Tales vehículos como automóviles pueden ser heredados, debido a que el propio vehículo es un vehículo

¿Qué vehículos?

Coches, aviones, helicópteros, estos son los vehículos

Entonces, ¿cómo diseñar este tipo de relación que?

Por ejemplo, para crear una clase de vehículo y luego heredará todas pertenecen al vehículo, para ir a conseguir. . .

Sin embargo, los aviones y los helicópteros tienen la función de vuelo, y el coche no lo hicieron, a continuación, en un vehículo si el vuelo para definir esta función, no sería apropiado. .

Podría respectivamente, para lograr esta función no volar en aviones y helicópteros de la clase? Sí, pero no se puede reutilizar el código.

¿Cómo hacer?

Para definir una clase separada vehículos, aeronaves y las dos clases de padres, este avión y helicópteros pueden ir a heredar estas dos categorías.

'''

# Vehículo de transporte

vehículo de clase ():

    # Transporte de mercancías

    def Huo (self):

        imprimir ( 'transporte de mercancías')

    # Llevar pasajeros

    def ren (self):

        imprimir ( 'transporta pasajeros')

aviones #

clase FlyingMixin ():

    def volar (auto):

        imprimir ( 'puede despegar ...')

#define Automotive

carrito de clase (vehículo):

    pasar

#define Aeronaves

avión clase (vehículo, FlyingMixin):

    pasar

#define helicóptero

helicóptero de la clase (vehículo, FlyingMixin):

    pasar

# En este momento para definir un avión que vuela de clases, por lo que el vehículo de vuelo, heredar directamente esta clase. Puede resolver este problema.

Pero # 1. Aparece clase herencia múltiple, al contrario de la 'is-a' 2. Este tipo de avión puede ser fácilmente malinterpretado

# Solución es utilizar la herencia múltiple, pero a las aeronaves de esta clase, que se define como una clase de Mixin de la mezcla,

En este punto, la aeronave es igual al # de esta clase, en función de la extensión para extender otras clases

'''

En el código anterior, aunque los helicópteros y aviones han utilizado herencia múltiple, que se hereda FlyingMixin

Sin embargo, debido a la adición de Minin este nombre de clase FlyingMixin, dijo el hombre detrás de la lectura del código, esta clase es una clase de Mixin

'''

`` `

### clases abstractas (a saber)

> Una clase abstracta es una clase especial:

> 1. La clase abstracta no puede ser utilizado, no se pueden crear instancias directamente se convierte en un objeto.

> 2. clase abstracta contiene método abstracto, el método no es un código de implementación del método abstracto.

> 3. La clase abstracta requiere subclases heredan, y anulan los métodos abstractos de la clase padre. Antes de que pueda utilizar.

`` `

clase abstracta, la aplicación general de las funciones y necesidades generales a planificarse en el diseño del programa, programación, algunos de los cuales son clara y debe ser completado,

Pero también puede haber cierta demanda no está claro, o no está seguro cómo alcanzar las necesidades específicas,

De manera que se puede poner la forma de lograr esta incertidumbre o el método detrás de la necesidad de ir a conseguir, definido como métodos abstractos (sólo define el nombre del método, no escribir código específico)

clase abstracta de las solicitudes:

    Por ejemplo, para desarrollar un marco que tiene algunas características básicas y extensiones. . . .

    Pero usted específicamente qué tipo de desarrollo de productos, marco de desarrollo con el marco de la gente no sabe o Aceptar.

    Por lo tanto, el marco tendrá una función determinada, y se fue detrás de algunas de las formas es necesaria la definición de descanso para lograr su propia lógica de negocio específico en los métodos.

`` `

definición abstracta de clase:

`` `Python

abc importación

# Si desea definir una clase abstracta, las propiedades MetaClass de esta categoría deberán ser metaclase = abc.ABCMeta

clase WriteCode (metaclase = abc.ABCMeta):

    # Requerido método abstracto, utilizando un decorador para decorar

    @ abc.abstractmethod

    def write_php (self):

        pasar

    write_java def (self):

        print ( 'código para lograr el desarrollo de Java)

    def write_python (self):

        imprimir ( 'pitón alcanzar código de desarrollo')

# Clase abstracta no puede ser instanciada directamente objetos

# Obj = WriteCode ()

# Impresión (obj)

#TypeError: No se puede instanciar WriteCode clase abstracta con métodos abstractos write_php

# Definir subclases heredan la clase abstracta, y métodos abstractos de la clase abstracta

clase Demo (WriteCode):

    def write_php (self):

        print ( 'código para lograr el desarrollo php')

a = Demo ()

impresión (a)

a.write_java ()

a.write_php ()

a.write_python ()

`` `

El dominio método de aprendizaje, ya que se doblará para superar!

Aprender a simios: los logros de su propia simplemente una boutique!

Supongo que te gusta

Origin www.cnblogs.com/itxdl/p/12522554.html
Recomendado
Clasificación