Classes e Objetos

PythonBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá sobre classes e objetos em Python. Uma classe é um modelo para criar objetos. Um objeto é uma instância de uma classe.

Conquistas

  • Nomes e Objetos (Names and Objects)
  • Escopos e Namespaces (Scopes and Namespaces)
  • Objetos de Instância (Instance Objects)
  • Objetos de Método (Method Objects)
  • Herança (Inheritance)
  • Variáveis Privadas (Private Variables)
Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível avançado com uma taxa de conclusão de 35%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Definindo e Criando uma Classe

Para definir uma classe em Python, use a palavra-chave class seguida pelo nome da classe.

A definição da classe deve conter um método __init__, que é um método especial em Python que é chamado quando um objeto é criado a partir da classe.

Abra um novo interpretador Python.

python3

Aqui está um exemplo de uma classe que representa um círculo:

class Circle:
    def __init__(self, radius):
        self.radius = radius

O método __init__ recebe um parâmetro radius e o atribui ao atributo radius do objeto.

Instanciando um Objeto de Instância

Para criar um objeto de instância a partir de uma classe, você precisa chamar o nome da classe seguido por parênteses. É chamado de "instância" porque é uma ocorrência específica da classe.

circle1 = Circle(5)

Isso cria um objeto de instância circle1 do tipo Circle com um raio de 5. Objetos de instância podem ser usados para armazenar dados que são específicos do objeto. Por exemplo, cada objeto Circle pode ter um raio diferente.

O método __init__ no passo anterior será chamado automaticamente quando o objeto for criado, e o atributo radius do objeto será inicializado com o valor 5.

O método __init__ é frequentemente usado para configurar o estado inicial de um objeto, como inicializar os atributos do objeto ou configurar conexões com recursos externos. Ele é chamado automaticamente quando o objeto é criado, então você não precisa chamá-lo você mesmo.

É importante notar que o método __init__ é apenas um método normal e pode ter qualquer nome. No entanto, a convenção de nomenclatura recomendada é usar __init__ para deixar claro que é o método inicializador da classe.

Acessando e Modificando Atributos

Para acessar os atributos de um objeto, use a notação de ponto (dot notation). Por exemplo, para acessar o raio do objeto circle1, você pode usar o seguinte código:

print(circle1.radius) ## Output: 5

Você pode modificar os atributos de um objeto atribuindo um novo valor a eles. Por exemplo, para alterar o raio do objeto circle1, você pode usar o seguinte código:

circle1.radius = 10
print(circle1.radius) ## Output: 10

Adicionar Objetos de Método

Um método é uma função que é definida dentro de uma classe e é usada para realizar operações nos dados armazenados nos atributos de um objeto. Em Python, métodos são definidos usando a palavra-chave def seguida pelo nome do método e uma lista de parâmetros.

Aqui está um exemplo de um método area definido na classe Circle:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

O método area calcula a área de um círculo com base em seu raio. Ele faz isso usando o atributo self.radius, que se refere ao raio do objeto no qual o método é chamado.

Para chamar um método em um objeto, use a notação de ponto (dot notation) seguida pelo nome do método e parênteses. Por exemplo, para chamar o método area no objeto circle1, você pode usar o seguinte código:

circle1 = Circle(15)
print(circle1.area()) ## Output: 706.5

Isso imprimirá a área do objeto circle1, que é uma instância específica da classe Circle.

Métodos são úteis para encapsular funcionalidades dentro de uma classe e fornecer uma maneira de operar nos dados armazenados nos atributos do objeto.

Iniciantes devem prestar atenção especial ao uso de parênteses. Os parênteses são usados para chamar o método no objeto, e os parênteses também são usados para passar os parâmetros para o método. Isso pode ser confuso no início, mas ficará mais claro à medida que você continuar aprendendo sobre classes e objetos.

Objetos de Instância e Objetos de Método são os dois principais tipos de objetos em Python. Em conclusão, objetos de instância são criados a partir de uma classe, e objetos de método são definidos dentro de uma classe.

Herança (Inheritance)

Herança é uma forma de criar uma nova classe que é uma versão modificada de uma classe existente. A nova classe é chamada de subclasse (subclass) e a classe existente é a superclasse (superclass).

A herança permite que você crie uma subclasse que possui todos os atributos e métodos da superclasse, e você também pode adicionar atributos e métodos adicionais à subclasse ou substituir os atributos e métodos da superclasse.

Aqui está um exemplo de uma subclasse Cylinder que herda da classe Circle:

class Cylinder(Circle):
    def __init__(self, radius, height):
        super().__init__(radius)
        self.height = height

A classe Cylinder tem um método __init__ que recebe dois parâmetros: radius e height. Ele chama o método __init__ da classe Circle usando a função super() para inicializar o atributo radius do objeto e, em seguida, define o atributo height do objeto.

A função super() é uma função especial em Python que se refere à superclasse de uma classe. Ela é usada para chamar métodos da superclasse de dentro da subclasse.

A função super() é definida na definição da classe e recebe o parâmetro self, que se refere ao objeto que está sendo criado. Ela também pode receber parâmetros adicionais dependendo do método que está sendo chamado. Neste exemplo, ela passa o parâmetro radius para o método __init__ da classe Circle e inicializa o atributo radius do objeto.

A classe Cylinder agora possui todos os atributos e métodos da classe Circle, bem como o atributo height adicional. Você pode acessar os atributos e métodos da classe Cylinder usando a notação de ponto (dot notation), assim como com a classe Circle.

Por exemplo, você pode criar um objeto Cylinder e acessar seus atributos da seguinte forma:

cylinder1 = Cylinder(5, 10)
print(cylinder1.radius)  ## prints 5
print(cylinder1.height)  ## prints 10

A herança é um recurso útil na programação orientada a objetos, pois permite que você reutilize código e crie uma hierarquia de classes.

A Função Super()

A função super() é útil quando você deseja reutilizar o código da superclasse na subclasse e estendê-lo com funcionalidade adicional.

É importante notar que a função super() não é uma referência estática à superclasse. É uma referência dinâmica que muda dependendo da classe na qual é chamada. Isso permite que você use herança em múltiplos níveis de herança e acesse a superclasse correta em cada nível.

Por exemplo, considere as seguintes classes:

class A:
    def method(self):
        print("A method")

class B(A):
    def method(self):
        super().method()
        print("B method")

class C(B):
    def method(self):
        super().method()
        print("C method")

Aqui, C é uma subclasse de B, que é uma subclasse de A. Se você chamar o método method em um objeto C, ele primeiro chamará o método method da classe A usando a função super(), depois o método method da classe B usando a função super(), e finalmente o método method da classe C.

obj = C()
obj.method()  ## prints "A method", "B method", "C method"

A função super() é um recurso útil na programação orientada a objetos que permite que você reutilize código e crie uma hierarquia de classes.

Variáveis Privadas

Em Python, variáveis privadas são variáveis que se destinam a serem usadas apenas dentro da classe na qual são definidas, e não por código externo. Variáveis privadas não são diretamente acessíveis de fora da classe.

Para definir uma variável privada na classe Circle, você pode usar o prefixo de sublinhado duplo (__) seguido pelo nome da variável. Por exemplo:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

Isso define uma variável privada __radius na classe Circle.

Variáveis privadas se destinam a serem usadas apenas dentro da classe na qual são definidas. Elas não são diretamente acessíveis de fora da classe. Por exemplo, se você tentar acessar a variável __radius de fora da classe Circle, você receberá um erro:

circle1 = Circle(5)
print(circle1.__radius)  ## This will raise an AttributeError

Variáveis privadas são úteis para encapsular dados dentro de uma classe e limitar a capacidade do código externo de modificá-los. No entanto, é importante notar que as variáveis privadas não são verdadeiramente privadas em Python e ainda podem ser acessadas de fora da classe usando "name mangling" (ofuscação de nomes).

Name mangling é uma técnica que envolve adicionar um prefixo especial ao nome da variável para dificultar o acesso de fora da classe.

Por exemplo, a variável __radius ainda pode ser acessada de fora da classe Circle usando a seguinte sintaxe:

print(circle1._Circle__radius)  ## This will print 5

No entanto, isso não é considerado uma boa prática de programação e deve ser evitado.

Em vez disso, você deve usar variáveis privadas apenas dentro da classe na qual são definidas e fornecer métodos públicos para acessar ou modificar os dados, se necessário.

Aqui está um exemplo de uma classe Circle com uma variável privada __radius e métodos públicos para acessar e modificar o raio:

class Circle:
    def __init__(self, radius):
        self.__radius = radius

    def get_radius(self):
        return self.__radius

    def set_radius(self, radius):
        self.__radius = radius

Para acessar o raio de um objeto Circle, você pode usar o método get_radius:

circle1 = Circle(5)
print(circle1.get_radius())  ## prints 5

Para modificar o raio de um objeto Circle, você pode usar o método set_radius:

circle1.set_radius(10)
print(circle1.get_radius())  ## prints 10

Resumo

Neste laboratório, você aprendeu sobre classes e objetos em Python. Você aprendeu como definir uma classe, criar um objeto a partir de uma classe, acessar atributos e métodos de um objeto, modificar atributos de um objeto e criar uma subclasse que herda de uma superclasse.

Aqui está um resumo dos principais conceitos abordados neste laboratório:

  • Uma classe é um modelo para criar objetos. Um objeto é uma instância de uma classe.
  • O método __init__ é chamado quando um objeto é criado a partir de uma classe. Ele permite que você defina os atributos do objeto.
  • Você pode acessar os atributos de um objeto usando a notação de ponto e chamar os métodos de um objeto usando a notação de ponto seguida pelo nome do método e parênteses.
  • Você pode modificar os atributos de um objeto atribuindo um novo valor a eles.
  • Herança permite que você crie uma subclasse que é uma versão modificada de uma superclasse. A subclasse pode substituir ou estender os métodos da superclasse.

Espero que este laboratório tenha ajudado você a aprender sobre classes e objetos Python. Avise-me se tiver alguma dúvida!