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 Animal
el tipo del objeto debe ser aprobada en Animal
el 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 Animal
tipo. 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. @property
decorador
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.