pitón de programación básica: objetos de Python, métodos, clases, instancias, análisis de uso de la función

Análisis de los ejemplos del presente documento objetos Python, métodos, clases, instancias, uso de la función. Compartir con usted para su referencia. Análisis específico es como sigue:

Python es un lenguaje totalmente orientado a objetos. Ejemplos no están sólo los objetos, clases, funciones, métodos son también objetos.

class Foo(object):
    static_attr = True
    def method(self):
        pass
foo = Foo()

Este código se crea realmente dos objetos, y Foo foo. Mientras que al mismo tiempo es una clase Foo, foo es una instancia de esta clase.
Definición de tipo se hace en C ++ en tiempo de compilación, se almacena en la memoria estática, no se puede modificar fácilmente. En los tipos de Python sí mismos están sujetos, y la instancia de objetos como se almacena en la pila, el intérprete es por ejemplo de la clase de objeto objeto y no fundamentalmente diferente.
En Python, cada objeto tiene su propio espacio de nombres. Variable en el espacio se almacenan en __dict__ del objeto. Por lo tanto, la clase Foo tiene un __dict__, ejemplo foo también tiene un __dict__, pero son dos espacios de nombres diferentes.
La llamada "definición de una clase" era en realidad el señor en un objeto de clase, y luego ejecutar una pieza de código, pero el espacio de nombres local cuando la clase se establece para ejecutar el código de __dict__ para que pueda escribir código como este:

>>> class Foo(object):
...     bar = 1 + 1
...     qux = bar + 1
...     print "bar: ", bar
...     print "qux: ", qux
...     print locals()
...
bar:  2
qux:  3
{'qux': 3, '__module__': '__main__', 'bar': 2}
>>> print Foo.bar, Foo.__dict__['bar']
2 2
>>> print Foo.qux, Foo.__dict__['qux']
3 3

La llamada "definición de una función", de hecho, es generar un objeto función. El "definir un método" que produce una
función de un objeto, y este objeto en un __dict__ clase. Formar los dos siguientes definiciones son métodos equivalentes:

>>> class Foo(object):
...     def bar(self):
...         return 2
...
>>> def qux(self):
...     return 3
...
>>> Foo.qux = qux
>>> print Foo.bar, Foo.__dict__['bar']
>>> print Foo.qux, Foo.__dict__['qux']

>>> foo = Foo()
>>> foo.bar()
2
>>> foo.qux()
3

La herencia de clases es simplemente para definir dos objetos de clase, cada uno de los cuales tiene diferente __dict__:

>>> class Cheese(object):
...     smell = 'good'
...     taste = 'good'
...
>>> class Stilton(Cheese):
...     smell = 'bad'
...
>>> print Cheese.smell
good
>>> print Cheese.taste
good
>>> print Stilton.smell
bad
>>> print Stilton.taste
good
>>> print 'taste' in Cheese.__dict__
True
>>> print 'taste' in Stilton.__dict__
False

Complejo lugar en .el operador. Para la clase es, medios Stilton.taste "en Stilton. Mirando dict__ el 'sabor'. Si no se encuentra, ir a los padres __dict__ de queso, entonces el padre de la clase padre, y así sucesivamente. Si usted ha estado a objeto todavía no se encuentra, entonces lanzar una AttributeError".
ejemplos también tienen su propia __dict
:

>>> class Cheese(object):
...     smell = 'good'
...     taste = 'good'
...     def __init__(self, weight):
...         self.weight = weight
...     def get_weight(self):
...         return self.weight
...
>>> class Stilton(Cheese):
...     smell = 'bad'
...
>>> stilton = Stilton('100g')
>>> print 'weight' in Cheese.__dict__
False
>>> print 'weight' in Stilton.__dict__
False
>>> print 'weight' in stilton.__dict__
True

Ya sea __init __ () se define en el que, stilton .__ dict__ tienen nada que ver con __dict__ clase.
Cheese.weight y Stilton.weight van mal, ya que estos dos no son ejemplo de espacio de nombres táctil. El
stilton.weight orden de búsqueda es Stilton. Dict => Stilton. Dict =>
Queso. Dict => Objeto. Dict . Esto es muy similar a mirar para Stilton.taste, justo
en frente de más de un paso.

El método es ligeramente más complicado.

>>> print Cheese.__dict__['get_weight']
>>> print Cheese.get_weight

>>> print stilton.get_weight
<__main__.Stilton object at 0x7ff820669190>>

Podemos ver el operador punto la función en una clase llamada método no unido a llamar directamente a funciones y punto en el espacio.
Método consolidado de la operación será devuelto por error diverso:

>>> Cheese.__dict__['get_weight']()
Traceback (most recent call last):
  File "", line 1, in
TypeError: get_weight() takes exactly 1 argument (0 given)
>>> Cheese.get_weight()
Traceback (most recent call last):
  File "", line 1, in
TypeError: unbound method get_weight() must be called with Cheese instance as
first argument (got nothing instead)

Pero una cosa es decir dos errores, método de instancia requiere una instancia. El llamado "método de unión" es simplemente una llamada de método a una instancia de un objeto como el primer parámetro. Estas llamadas de los métodos siguientes son equivalentes

>>> Cheese.__dict__['get_weight'](stilton)
'100g'
>>> Cheese.get_weight(stilton)
'100g'
>>> Stilton.get_weight(stilton)
'100g'
>>> stilton.get_weight()
'100g'

La última es la forma habitual con la llamada, stilton.get_weight (), es otro operador de punto de función, el stilton.get_weight () traducido en stilton.get_weight (stilton).
De esta manera, la llamada al método tiene en realidad dos pasos. En primer lugar, encontrar una propiedad que se encuentre get_weight reglas, entonces esta propiedad como una llamada a la función, y la primera instancia de un objeto como un parámetro. No hay relación entre estos dos pasos. Por ejemplo, puede intentar lo siguiente:

>>> stilton.weight()
Traceback (most recent call last):
  File "", line 1, in
TypeError: 'str' object is not callabl

Encuentra peso a esta propiedad, entonces el peso como una llamada a la función. Pero el peso es una cadena, de manera equivocada. Buscar propiedades deben tenerse en cuenta aquí es un ejemplo desde el principio:

>>> stilton.get_weight = lambda : '200g'
>>> stilton.get_weight()
'200g'

pero

>>> Stilton.get_weight(stilton)
'100g'

Stilton.get_weight de búsqueda de salto Stilton instancia de un objeto, que se encuentra a no ser cubierto, el método definido en el queso.
getattr (stilton, 'peso') y stilton.weight son equivalentes. instancia de objeto de clase del objeto y no hay diferencia esencial, getattr (Cheese, 'olor' ) y Cheese.smell igualmente equivalente. getattr () en comparación con el beneficio operador punto es el nombre de atributo especificado cadena, se puede cambiar en tiempo de ejecución.

getAttribute () es el código subyacente. Si no vuelve a definir este método, objeto. GetAttribute () y tipo. GetAttribute () es getattr () se materializa, por ejemplo del primer caso, para la última clase. En otras palabras, stilton.weight es objeto. GetAttribute (Stilton, 'peso'). Esta cubierta es propenso a errores. Por ejemplo, el operador punto puede conducir a la recursividad infinita:

def __getattribute__(self, name):
        return self.__dict__[name]

getAttribute () Hay otros detalles, como para lograr protocolo descriptor, si es fácil volver a escribir error.
getattr método () es llamado para encontrar __dict__ caso de que no se encuentra. atributos Generalmente generadas dinámicamente utilizan esto, porque __getattr __ () no interfiere para poner __dict__ definido en la propiedad en otros lugares.

>>> class Cheese(object):
...     smell = 'good'
...     taste = 'good'
...
>>> class Stilton(Cheese):
...     smell = 'bad'
...     def __getattr__(self, name):
...         return 'Dynamically created attribute "%s"' % name
...
>>> stilton = Stilton()
>>> print stilton.taste
good
>>> print stilton.weight
Dynamically created attribute "weight"
>>> print 'weight' in stilton.__dict__
False

Dado que el método sólo es posible como una llamada función de propiedad, getattr () método también se puede utilizar para generar dinámicamente, pero también hay que prestar atención a la recursividad infinita:

>>> class Cheese(object):
...     smell = 'good'
...     taste = 'good'
...     def __init__(self, weight):
...         self.weight = weight
...
>>> class Stilton(Cheese):
...     smell = 'bad'
...     def __getattr__(self, name):
...         if name.startswith('get_'):
...             def func():
...                 return getattr(self, name[4:])
...             return func
...         else:
...             if hasattr(self, name):
...                 return getattr(self, name)
...             else:
...                 raise AttributeError(name)
...
>>> stilton = Stilton('100g')
>>> print stilton.weight
100g
>>> print stilton.get_weight
>>> print stilton.get_weight()
100g
>>> print stilton.age
Traceback (most recent call last):
  File "", line 1, in
  File "", line 12, in __getattr__
AttributeError: age

El contenido de más de cuántos, y finalmente a recomendar una buena reputación en el número de instituciones públicas [programadores], hay una gran cantidad de veteranos habilidades de aprendizaje, experiencia, habilidades de la entrevista, la experiencia laboral y otra cuota de aprendizaje, cuanto más cuidadosamente preparado el basado en cero información introductoria sobre los datos reales del proyecto todos los días para explicar la sincronización de la tecnología de los programadores de Python, y compartir algo de aprendizaje métodos tienen que prestar atención a los pequeños detallesAquí Insertar imagen Descripción

Publicado 20 artículos originales · ganado elogios 0 · Vistas 3616

Supongo que te gusta

Origin blog.csdn.net/chengxun02/article/details/104996434
Recomendado
Clasificación