Digamos que desejamos fornecer uma abstração de uma "conta" em um banco. Aqui está uma abordagem, usando um function
objeto em Python:
def account():
"""Return a dispatch dictionary representing a bank account.
>>> a = account()
>>> a['deposit'](100)
100
>>> a['withdraw'](90)
10
>>> a['withdraw'](90)
'Insufficient funds'
>>> a['balance']
10
"""
def withdraw(amount):
if amount > dispatch['balance']:
return 'Insufficient funds'
dispatch['balance'] -= amount
return dispatch['balance']
def deposit(amount):
dispatch['balance'] += amount
return dispatch['balance']
dispatch = {'balance': 0,
'withdraw': withdraw,
'deposit': deposit}
return dispatch
Aqui está outra abordagem usando a abstração de tipo (por exemplo, class
palavra-chave em Python):
class Account(object):
"""A bank account has a balance and an account holder.
>>> a = Account('John')
>>> a.deposit(100)
100
>>> a.withdraw(90)
10
>>> a.withdraw(90)
'Insufficient funds'
>>> a.balance
10
"""
def __init__(self, account_holder):
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
"""Add amount to balance."""
self.balance = self.balance + amount
return self.balance
def withdraw(self, amount):
"""Subtract amount from balance if funds are available."""
if amount > self.balance:
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balance
Meu professor iniciou o tópico "Programação orientada a objetos" introduzindo a class
palavra - chave e mostrando-nos os seguintes pontos:
Programação orientada a objetos
Um método para organizar programas modulares:
- Barreiras de abstração
- Passagem de mensagem
- Agrupando informações e comportamento relacionado
Você acha que a primeira abordagem seria suficiente para satisfazer a definição acima? Se sim, por que precisamos da class
palavra-chave para fazer programação orientada a objetos?
design
object-oriented
python
object-oriented-design
object
overexchange
fonte
fonte
class
faça uma otimização semelhante).foo.bar()
é geralmente idêntico efoo['bar']()
, em raras ocasiões, a última sintaxe é realmente útil.object['method'](args)
, os objetos Python realmente fazem o equivalente aobject['method'](object, args)
. Isso se torna relevante quando uma classe base chama métodos em uma classe filho, por exemplo, no Padrão de Estratégia.Respostas:
Parabéns! Você redescobriu o fato conhecido de que a orientação a objetos pode ser feita sem suporte específico à linguagem de programação. É basicamente da mesma maneira que os objetos são introduzidos no esquema neste livro de texto clássico . Observe que Scheme não possui uma
class
palavra - chave ou algum tipo de equivalente, e os objetos podem ser criados sem ter mesmo classes.No entanto, o paradigma orientado a objetos foi tão bem-sucedido que muitas linguagens - e Python não é exceção - fornecem suporte interno para ele. Isso é simplesmente para facilitar o uso do paradigma pelos desenvolvedores e fornecer uma forma padrão de orientação a objetos para esse idioma. É essencialmente a mesma razão pela qual muitas linguagens fornecem um
for
loop, embora ele possa ser emulado usando umwhile
loop com apenas uma ou duas linhas de código adicionais - simplesmente facilidade de uso .fonte
Concordo que a primeira definição satisfaz os três pontos que seu professor fez. Acho que não precisamos da palavra-chave class para nada. Nos bastidores, o que mais é um objeto além de uma estrutura de dados com diferentes tipos de dados e funções para trabalhar com os dados? Obviamente, as funções também são dados.
Eu diria ainda mais que a programação orientada a objetos não depende muito das palavras - chave fornecidas pela sua linguagem; você pode fazer a programação orientada a objetos em C, se assim o desejar! De fato, o kernel do linux emprega essas técnicas.
O que você pode deduzir da palavra-chave class aqui é que a linguagem fornece suporte para esse tipo de construção pronta para uso, e você não precisa realizar todos os processos para reimplementar a funcionalidade sozinho (o que é uma tarefa bastante divertida em em si!). Sem mencionar todo o açúcar sintático que você pode obter também.
fonte
Claro que você pode!
A linguagem de programação automática é uma linguagem dinâmica orientada a objetos, baseada em protótipo, na qual tudo é um objeto e não há senso de classe ou qualquer outra coisa. Ele se concentra na idéia de objetos prototípicos e na ideia de cloná-los, em vez de ter classes como modelos de como criar objetos.
Você deve verificar http://www.selflanguage.org/ para obter mais informações. Eu acho que é muito interessante e se você gosta de OOP, é uma boa ideia verificar algo que não é tão comum.
fonte
Nem sempre: depende do idioma. Você demonstrou a capacidade de fazer isso no Python, mas (se sua pergunta é agnóstica à linguagem, apesar da tag Python), nem todas as linguagens podem fazer isso. Java, por exemplo, geralmente não pode. Ignorando a classe que contém main, não há como definir métodos / campos arbitrários em um objeto definido no main sem a palavra-chave class. Embora existam classes anônimas, elas exigem uma interface e não podem ter nenhum membro público, exceto aqueles definidos na interface. Embora seja possível definir interfaces personalizadas e criar classes anônimas para elas, isso é efetivamente o mesmo (mas menos conveniente) do que simplesmente usar uma classe.
Doc Brown tem uma ótima resposta, mas o que estou tentando dizer é que tenho certeza de que há pelo menos um idioma que não permitirá a sua solução.
fonte
class
palavra - chave, para que não seja uma surpresa. Mas você absolutamente pode implementar seu próprio sistema de objetos em cima do sistema de objetos de Java, embora eu não saiba por que você deseja fazer uma coisa dessas.class
palavra - chave apenas porque a linguagem exige que você coloque suas funções nas classes. Obviamente, isso é extremamente teórico, mas mesmo em Java você pode fazer Orientação a Objetos sem as classes internas!A definição do professor perde completamente o ponto mais importante da programação orientada a objetos, a única coisa que a torna útil e única. "Passagem de mensagens" é um monte de bobagens sonhadas pelo pessoal do Smalltalk, e tem sido um fracasso em todos os lugares em que foram tentadas. O verdadeiro poder do OOP é algo conhecido como substituição de Liskov , e embora o conceito seja bastante simples de descrever e entender, a implementação subjacente é complexa o suficiente para que seja essencialmente impossível fazer o certo sem o suporte no nível da linguagem.
A idéia da substituição de Liskov é que, em qualquer lugar em que seu código esteja esperando uma variável de um determinado tipo, ele poderá aceitar qualquer tipo derivado desse tipo e ainda funcionar corretamente sem precisar ter conhecimento dos detalhes do tipo derivado.
Por exemplo, as estruturas da GUI usam a substituição Liskov em todo o lugar. Eles tendem a ter uma
Control
classe base que pode representar "qualquer controle", que define uma interface que conhece ações básicas como desenhar, redimensionar e responder à entrada do usuário. Se você clicar em um controle, a estrutura da interface do usuário chamará umClick
método no controle sem precisar se preocupar com o tipo de controle e, em seguida, deixar o controle manipular o clique da maneira apropriada para sua própria classe. UmButton
controle deve fazer algo completamente diferente quando clicado em umTextBox
controle, para dar apenas um exemplo.Portanto, sim, você pode criar algo parecido com objetos usando o truque de funções aninhadas descrito acima, mas como você não pode obter herança e substituição de Liskov dessa maneira, é um substituto extremamente limitado para o verdadeiro OOP.
fonte
child*
para uma função que usa aparent*
como argumento, pelo menos não sem um typecast.) E ainda pior, as estruturas C não podem ter métodos vinculados a elas e não há suporte para métodos virtuais , que são o que faz a mágica da substituição de Liskov funcionar, então você precisa construir VMTs manualmente, o que é um processo complicado e fácil de estragar.Resposta rápida e curta
Sim, os programadores podem aplicar a programação orientada a objetos sem "classes".
Resposta descritiva extensa e aborrecida longa
Existem várias variações de "Orientação a Objetos", apesar de tudo, o primeiro conceito que vem à mente de muitos programadores é "Classes".
Sim, os programadores podem aplicar a programação orientada a objetos sem "classes", mas estão limitados aos recursos e limitações de cada linguagem de programação.
Sua postagem está marcada como Python ; portanto, o título da sua pergunta pode ser mais como "Como implementar a programação orientada a objetos sem classes no Python".
Atualmente, uso a frase "Programação Orientada a Objetos e Classes" para identificar outras variações, como "Prototipagem" do Javascript ou "Baseada em Visual Basic" ou emulação em "Pure C" usando "functors".
fonte