OPP Algunos gatos y perros

Tipo 1. Los Patos

  "Duck typing" lenguaje dinámico, que no requiere estricta jerarquía de herencia, siempre y cuando un objeto "parece un pato, camina como un pato", entonces puede ser visto como un pato.

  Para los lenguajes de tipos estáticos (como Java), si la necesidad de aprobar Animalel tipo del objeto debe ser aprobada en Animalel tipo o subclase de ella, de lo contrario, no se puede llamar al run()método.

  Para los lenguajes dinámicos como Python, que no necesariamente tienen que pasar Animaltipo. Sólo tenemos que garantizar ese objeto entrante tiene un run()método en él:

  Por ejemplo: Pitón de "tipo fichero objeto" es una especie de tipificación de pato. Para el objeto de archivo real, tiene un read()método que devuelve su contenido. Sin embargo, muchos objetos, siempre y cuando el read()método se considera "de tipo fichero objeto".

  Muchos función recibe el argumento es "de tipo fichero objeto", que no tiene que pasar un objeto de archivo real, puede pasar cualquier aplicación de read()métodos de objeto.

 

2. Obtener información de los objetos

1) Obtener el dir Propiedades de objeto, métodos ()

>>> dir ( ' ABC ' ) 
[ ' __add__ ' , ' __class__ ' , ..., ' __subclasshook__ ' , ' capitalizar ' , ' casefold ' , ..., ' zfill ' ]

   __xxx__ método, generalmente para fines especiales, por ejemplo: __ length__

>>> len ( ' ABC ' )
 3 
>>> ' ABC ' . __len__ ()
 3
# ---- escribir nuestra propia clase, si también quieren utilizar len (myObj), un __ () método __len continuación, escribe usted mismo:
 
>>> clase mydog (Objeto): 
...      DEF  __len__ (Ser): 
. ..          retorno 100 
...
 >>> perro = mydog ()
 >>> len (perros)
 100

2) hasattr: detectar la presencia de propiedades

>>> clase del MiObjeto (Objeto): 
...      DEF  la __init__ (Ser): 
... self.x = 9. 
...      DEF alimentación (Ser): 
...          retorno self.x * self.x 
...
 > obj = >> la MiObjeto ()
 # --------------------------- 
>>> la hasattr (obj, ' X ' ) # tienen atributos x 'es? 
Es cierto
 >>> obj.x
 9 
>>> hasattr (obj, ' el y- ' ) # tener 'y' atributos hacer? 
falso

3) getattr 和 setattr

Setattr >>> (obj, ' el y- ' , 19) # establecer una propiedad 'y' 
>>> hasattr (obj, ' el y- ' ) # tener 'y' atributos hacer? 
Es cierto
 >>> getattr (obj, ' el y- ' ) # propiedad get 'del y-' 
19 
>>> obj.y # obtener las propiedades 'del y-' 
19 
# AttributeError Si intenta adquirir la propiedad no existe, se produce un error: >> > getattr (obj, ' Z ' ) # propiedad get 'Z' Rastreo (más reciente Última llamada): File " <stdin> AttributeError: ' la MiObjeto ' atributo de objeto no tiene ' Z ' # puede pasar un parámetro por defecto, si no existe el atributo, devuelve un valor por defecto: >>> getattr (obj, ' Z ' , 404) # get propiedad 'z', Si no es así, devolver el valor predeterminado 404 404 # también maneras de conseguir objetos: >>> hasattr (obj, ' poder ' ) # tener atributos 'poder' que? Es cierto >>> getattr (obj, ' Poder ' ) # propiedad get 'Power' <Método de MyObject.power obligado < __main__ .MyObject objeto en 0x10077a6a0 >> Poder ' ) # propiedad get' poder 'y se asigna a la variable Fn >>> Fn # Fn punto obj.power <Método de MyObject.power obligado < __main__ .MyObject objeto en 0x10077a6a0 >> >>> fn () # fn llamada ( ) llamando obj.power () es la misma que 81

 

3. @propertydecorador

Una forma para convertirse en responsable de la propiedad llamada

hace uso

clase Estudiante (objeto): 

    def get_score (auto):
          volver self._score 

    def set_score (auto, valor):
         si  no isinstance (valor, int):
             aumento ValueError ( ' puntuación debe ser un entero! ' )
         si el valor <0 o valor> 100 :
             aumento ValueError ( ' ! debe tener una puntuación entre 0 ~ 100 ' ) 
        self._score = valor 

# ---------------------- 
>>> s = estudiante ()
 >>> s.set_score (60)# Ok! 
>>> s.get_score ()
 60 
>>> s.set_score (9999 ) 
Rastreo (llamada más reciente pasado): 
  ... 
ValueError: debe tener una puntuación entre 0 ~ 100!

después de su uso

(Sólo define métodos getter método setter definida no es una propiedad de sólo lectura, el siguiente ejemplo es una edad atributo de sólo lectura, Nacimiento y arreglo son propiedad de lectura y escritura)

clase Estudiante (objeto): 

    @property 
    def edad (auto):
         retorno 2015 - self._birth 

    @property 
    def nacimiento (auto):
         retorno self._birth 

    @ birth.setter 
    def nacimiento (auto, valor): 
        self._birth = valor 

    @ propiedad 
    def puntuación de (auto):
         volver self._score 

    @ score.setter 
    def puntuación de (auto, valor):
         si  no isinstance (valor, int):
             aumento ValueError ( ' puntuación debe ser un entero! ')
         Si el valor <0 o valor> 100 :
             aumento ValueError ( ' ! Marcar, debe entre 0 ~ 100 ' ) 
        self._score = valor 
    
# --------------------- - 
>>> s = Estudiantes ()
 >>> s.score = 60 # OK,实际转化为s.set_score (60) 
>>> s.score # OK,实际转化为s.get_score () 
60 
>>> s.score = 9999 
Rastreo (llamada más reciente pasado): 
  ... 
ValueError: debe tener una puntuación entre 0 ~ 100!

 

4. La herencia múltiple

  

# 设计类
clase Animal (objeto):
     pase 

# 大类: 
clase de Mamíferos (Animal):
     pase 

la clase de Aves (Animal):
     pase 

# 各种动物: 
# clase de perro (de mamífero): 
    # pase 

clase de perro (Mamífero, Ejecutable):
     pasar 

# clase Bat (de mamífero): 
  # pase 

clase Bat (Mamífero, Flyable):
     pase 

# clase loro (Bird): 
  # pase 

# avestruz clase (Bird): 
  # pase 

# 跑/飞类

clase Ejecutable (objeto):
 
  def ejecutar (self): 
    print ( ' Running ... ' ) 

de clase Flyable (objeto): 
     def volar (self): 
             print ( ' Flying ... ' )
            

 

MixIn

  Una clase para aumentar el número de funciones, de modo que en la categoría de diseño, damos prioridad a la herencia múltiple por una combinación de funciones de múltiples MixIn, más que el diseño del complejo de la herencia de varios niveles.

 

Supongo que te gusta

Origin www.cnblogs.com/jpga/p/12581223.html
Recomendado
Clasificación