Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Crie uma classe ‘Hello’ tal que se definirmos um objeto 'a' da classe 'Hello' usando o comando a=Hello(), o comando print(a(‘students’)) retornará a frase ’Hello, students!’ e o comando print(a) retornará a frase ’Hello, World!’.

0 votos
27 visitas
perguntada Ago 6 em Programação Computacional por Thiago Trafane (21 pontos)  
editado Ago 6 por Thiago Trafane

Exercício 7.10 do Cap. 7 do livro "A Primer on Scientific Programming with Python" de Hans Petter Langtangen.

Compartilhe

1 Resposta

0 votos
respondida Ago 6 por Thiago Trafane (21 pontos)  
editado Ago 28 por Thiago Trafane

A classe “Hello” solicitada no enunciado pode ser criada com o seguinte código:

class Hello:        
    def __init__(self):
        pass
    def __str__(self):
        return('Hello, World!')
    def __call__(self,name='World'):
        return('Hello, ' + name + '!')

Como se vê, eu usei três métodos mágicos na definição dessa classe. Em primeiro lugar, o método __ init __, que é usado apenas para inicializar a classe. Apesar de não ser necessário nesse exercício, o uso desse método é uma boa prática, como destacado pelo colega Fabio Fujita. Note que como essa classe não recebe nenhum input, optei por deixá-la sem nenhum atributo, usando a palavra "pass".

Em segundo lugar, o método __ str __, que retorna uma representação de string de um objeto. Assim, ao chamarmos um objeto da classe ‘Hello’, será retornada a string 'Hello, World!'.

Em terceiro lugar, o método __ call __, que faz com que um objeto se comporte como uma função, podendo ser chamado como tal. Assim, sendo ‘a’ um objeto da classe ‘Hello’, o comando a(‘students’) nos dá o valor da função definida em __ call __ para o argumento ‘students’, isto é, nos dá ‘Hello, students!’.

Portanto, dada a classe 'Hello' assim definida, podemos rodar o seguinte programa:

if __name__ == '__main__':
    a = Hello()

    print(a('students'))
    print(a)

Com isso, obteremos os outputs desejados: 'Hello, students!' e 'Hello, World!'.

comentou Ago 25 por Fabio Fujita (36 pontos)  
Parabéns pela solução, Thiago. Você fez aquilo que o exercício requeria, ou seja, deduzir a implementação de uma classe com base no que foi apresentado.

Tenho dois comentários:

1. Uma forma alternativa de representar o objeto com a string “Hello World!” seria utilizar o método __repr__ ao invés do método __str__. A Implementação seria:

def__repr__(self):
    return “Hello, World!”

Caso tenha curiosidade, o assunto é discutido na seção 7.3.9 do livro.

2. Embora não seja um requisito para essa aplicação simples, é uma boa prática usar um construtor e inicializar os atributos das classes criadas. Isso pode ser feito, por exemplo, introduzindo o seguinte método logo após a criação da classe:

def __init__ (self, name=None):
    self.name=name

Sempre teremos muitas maneiras de resolver um mesmo problema. Como eu disse anteriormente, esses são apenas comentários que não influenciarão o resultado final para essa aplicação.
comentou Ago 27 por Thiago Trafane (21 pontos)  
editado Ago 28 por Thiago Trafane
Fabio, obrigado pelos seus comentários! Sobre eles, gostaria de destacar que:

1) Realmente o método mágico __repr__ fornece o mesmo resultado do método __str__. Por isso, mantive o que havia feito.

2) Seguindo sua sugestão, adicionei o método mágico __init__. Contudo, como essa classe não recebe nenhum input, optei por deixá-la sem nenhum atributo, usando a palavra "pass".
...