Are a class's methods a type of closure?
Não. Um encerramento é um tipo muito específico de função. Como diz a Wikipedia, eles implementam o escopo léxico .
Encerramentos
No Python, esse fechamento seria assim:
def startAt(x):
def incrementBy(y):
return x + y
return incrementBy
A variável x
é ligada (no caso do Python, imutável) no incrementBy
que é criado quando startAt
é chamado. ( x
poderia muito bem ser uma estrutura de dados mutável, ou a implementação do seu idioma pode permitir que você a altere.)
Por contraste, aqui está um exemplo de função sem fechamento que usa um global:
x = 0
def incrementBy(y):
return x + y
Aqui, há uma única função, incrementBy
, e sempre que x muda no escopo global, isso é refletido na função:
>>> incrementBy(5)
5
>>> x = 1
>>> incrementBy(5)
6
Métodos
Os métodos, por outro lado, têm acesso a variáveis mutáveis. Se eles são métodos de instância, eles conhecem sua instância e, portanto, classe. Se eles são métodos de classe, eles conhecem sua classe. Mesmo que sejam métodos estáticos, não conhecendo classe ou instância, eles ainda podem usar globals. Os globais podem ser reatribuídos à vontade e podem, assim, alterar as saídas da função para qualquer dado.
Você pode fazer um encerramento em um método anexado a uma classe, dependendo da implementação do seu idioma:
class Foo(object):
ib5 = staticmethod(startAt(5))
>>> Foo.ib5(3)
8
>>> Foo.ib5
<function incrementBy at 0x7f29e978b758>
Mas eu não acho que é isso que você realmente quer fazer.
O que é um fechamento?
Um encerramento é uma função interna que liga variáveis a ele a partir do escopo da função externa. Se o método de uma turma não fizer isso, não será um encerramento.
Métodos e fechamentos de comparação e contraste
O que eles têm em comum é combinar funcionalidade com dados.
Onde eles contrastam é os encerramentos ligam os dados à funcionalidade, enquanto os métodos vinculam a funcionalidade às estruturas de dados. Portanto, não seria correto chamar um método de um tipo de fechamento a menos que ele realmente seja um fechamento.
Eu diria que a maioria dos métodos de classe não faz isso, mas permitirei que haja ambientes em que essa seja uma técnica reconhecida. Eu ficaria muito interessado em saber quem está usando isso e qual a justificativa deles. Eu pessoalmente nunca vi isso sendo feito na natureza.