Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Python Procedural x OO

Fiquei com uma dúvida e só preciso de um esclarecimento.

Quando saímos do mundo "Procedural" para o mundo OO, criamos OBJETOS, e esses objetos possuem seus métodos.

No mundo procedural por exemplo temos: "abs()" e no OO temos "abs"

Ou seja, podemos esperar que se há um método "len()" com certeza haverá seu irmão OO "len", ou seja, os métodos do procedural e do OO são sempre iguais ou existem exceções?

Porque por exemplo, estou iniciando um projeto no python, eu sei resolver esse problema da forma procedural, então posso esperar ter o mesmo método mas aplicado ao OO?

2 respostas

Olá Igor,

o que acontece é que em linhas gerais, na programação procedural a funcionalidades serão definidas por funções. Enquanto que em OO serão definidas por métodos.

Esses métodos geralmente estarão em uma classe que de forma coesa representará o domínio.

Por exemplo, a classe Fila, poderá ter o método ou atributo comprimento, pois comprimento é uma característica que pode ser importante para quem quer representar uma fila.

Entre muitas outras coisas, a forma de abstração e representação em OO é mais eficiente para muitos contextos.

solução!

Igor, essa é uma discussão quase filosófica. Entre as linguagens populares geralmente as coisas não são escritas em pedra. O encapsulamento é uma boa prática mas não algo forçado. Eu não sei se e quando o curso que está fazendo tratará desse assunto, mas no python uma prática comum é criar as propriedades com o decorador @property e ajustar o método de escrita, um examplo do stack. O que está declarado aqui:

1) Uma classe (C) que é um modelo para criação de objetos.

2) Um métido init_ que vai ser executado sempre que criar um objeto que instancie essa classe.

3) uma propriedade x (marcado com o @property) que existirá para todos os objetos 'derivados' da classe C.

4) Dois métodos, um de escrita e outro de 'deleção' da propriedade.

Note que dessa forma sempre que você tentar alterar a propriedade na verdade você estará chamando por debaixo dos panos o método 'setter', isso permite por exemplo que você ajuste outras variáveis internas ou faça algum outro procedimento (gravar em um banco de dados talvez?), que garantirá o encapsulamento do objeto.

No entanto você não é obrigado a fazer dessa forma... Se você declarar apenas uma 'variável' interna na classe, você poderá modificá-la diretamente, mesmo sem ter escrito um método setter.

Talvez o seu curso vá tratar desses aspectos posteriormente.

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        print("getter of x called")
        return self._x

    @x.setter
    def x(self, value):
        print("setter of x called")
        self._x = value

    @x.deleter
    def x(self):
        print("deleter of x called")
        del self._x


c = C()
c.x = 'foo'  # setter called
foo = c.x    # getter called
del c.x      # deleter called