python - desenvolvimento - livro django blogspot



O que são objetos de "primeira classe"? (4)

"Primeira classe" significa que você pode operá-las da maneira usual. Na maioria das vezes, isso significa apenas que você pode passar esses cidadãos de primeira classe como argumentos para funções, ou devolvê-los de funções.

Isso é evidente para objetos, mas nem sempre é tão evidente para funções, ou mesmo classes:

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

Este é um exemplo em C # onde funções na verdade não são objetos de primeira classe. O código acima, portanto, usa uma pequena solução alternativa (ou seja, um delegado genérico chamado Action<> ) para passar uma função como um argumento. Outras linguagens, como Ruby, permitem tratar até classes e blocos de código como variáveis ​​normais (ou, no caso de Ruby, constantes).

https://ffff65535.com

Quando objetos ou algo mais é considerado "primeira classe" em uma dada linguagem de programação e por quê? Em que diferem das línguas onde não estão?

EDITAR. Quando alguém diz "tudo é um objeto" (como em Python), ele realmente quer dizer que "tudo é de primeira classe"?


"Quando alguém diz que" tudo é um objeto "(como em Python), ele realmente quer dizer que" tudo é de primeira classe "?

Sim.

Tudo no Python é um objeto adequado. Até mesmo coisas que são "tipos primitivos" em outras linguagens.

Você acha que um objeto como 2 na verdade tem uma interface bastante rica e sofisticada.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

Como tudo é um objeto de primeira classe em Python, há relativamente poucos casos especiais obscuros.

Em Java, por exemplo, existem tipos primitivos (int, bool, double, char) que não são objetos apropriados. É por isso que o Java tem que introduzir Integer, Boolean, Double e Character como tipos de primeira classe. Isso pode ser difícil de ensinar aos iniciantes - não é óbvio por que tanto um tipo primitivo quanto uma classe têm que existir lado a lado.

Isso também significa que a classe de um objeto é - em si - um objeto. Isso é diferente do C ++, onde as classes nem sempre têm uma existência distinta em tempo de execução.

O tipo de 2 é o type 'int' , que possui métodos, atributos e um tipo.

>>> type(2)
<type 'int'>

O tipo de um tipo int como int é o type 'type' objeto. Isto também tem métodos e atributos.

>>> type(type(2))
<type 'type'>

IMO esta é uma daquelas metáforas usadas para descrever as coisas em uma linguagem natural. O termo é essencialmente usado no contexto de descrever funções como objetos de primeira classe.

Se você considerar uma linguagem orientada a objetos, podemos transmitir vários recursos para objetos, por exemplo: herança, definição de classe, capacidade de passar para outras seções de código (argumentos de método), capacidade de armazenar em uma estrutura de dados etc. mesmo com uma entidade que normalmente não é considerada como um objeto, como funções no caso do script java, tais entidades são consideradas objetos de primeira classe.

Primeira classe essencialmente aqui significa, não tratada como segunda classe (com comportamento degradado). Essencialmente, a zombaria é perfeita ou indistinguível.


Em resumo, isso significa que não há restrições quanto ao uso do objeto. É o mesmo que qualquer outro objeto.

Um objeto de primeira classe é uma entidade que pode ser criada dinamicamente, destruída, passada para uma função, retornada como um valor e tendo todos os direitos como outras variáveis ​​na linguagem de programação.

Dependendo do idioma, isso pode implicar:

  • sendo expressável como um valor literal anônimo
  • sendo armazenável em variáveis
  • sendo armazenável em estruturas de dados
  • ter uma identidade intrínseca (independente de qualquer nome)
  • sendo comparável por igualdade com outras entidades
  • sendo passável como parâmetro para um procedimento / função
  • ser retornável como resultado de um procedimento / função
  • sendo construtível em tempo de execução
  • sendo imprimível
  • sendo legível
  • sendo transmissível entre processos distribuídos
  • sendo armazenável fora de processos em execução

Source

Em C ++, as próprias funções não são objetos de primeira classe, no entanto:

  • Você pode substituir o operador '()', tornando possível ter uma função de objeto, que é de primeira classe.
  • Ponteiros de função são de primeira classe.
  • Aumentar bind, lambda e função oferecem funções de primeira classe

Em C ++, as classes não são objetos de primeira classe, mas instâncias dessas classes são. No Python, as classes e os objetos são objetos de primeira classe. (Veja esta resposta para mais detalhes sobre classes como objetos).

Aqui está um exemplo de funções de primeira classe do Javascript:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

Source

Entidades que não são objetos de primeira classe são chamadas de objetos de segunda classe. Funções em C ++ são de segunda classe porque não podem ser criadas dinamicamente.

Em relação à edição:

EDITAR. Quando alguém diz "tudo é um objeto" (como em Python), ele realmente quer dizer que "tudo é de primeira classe"?

O termo objeto pode ser usado livremente e não implica ser de primeira classe. E provavelmente faria mais sentido chamar todo o conceito de "entidades de primeira classe". Mas em Python eles visam fazer tudo de primeira classe. Eu acredito que a intenção da pessoa que fez sua declaração significou de primeira classe.





language-agnostic