2.20. Primeira classe¶
Uma classe agrupa dados e as funções que atuam sobre esses dados sob um único nome. Recorrer a uma vale a pena quando várias partes do estado pertencem juntas e a maioria das funções de um script recebe esse mesmo conjunto de valores como argumentos.
2.20.1. A palavra-chave class¶
A palavra-chave é class. O corpo contém um método __init__ que é executado toda vez que uma nova instância é criada:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Saída:
3 4
Point é a classe; p é uma instância dela. Os parênteses na chamada Point(3, 4) invocam __init__, que atribui os argumentos a atributos na nova instância. self é o nome convencional para a instância; self.x define um atributo que os demais métodos da instância lerão.
2.20.2. Quando usar uma classe¶
Recorra a uma classe quando estas condições forem verdadeiras ao mesmo tempo:
Um punhado de valores relacionados viaja junto por toda parte (o
xe oyde um ponto; o valor, a unidade e o timestamp de uma leitura de sensor).Várias funções recebem esse mesmo conjunto de valores e operam sobre eles.
É útil manter mais de um desses conjuntos vivo ao mesmo tempo, distintos uns dos outros.
Se os dados são pontuais, um dict ou tuple comum costuma ser suficiente. Se você só precisa de um único conjunto de constantes, variáveis em nível de módulo servem bem. Classes não são o contêiner padrão – elas ganham seu lugar quando estado e comportamento querem permanecer juntos.
2.20.3. O que __init__ faz¶
__init__ é apenas um método comum. Qualquer coisa atribuída a self dentro dele torna-se um atributo na nova instância:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Saída:
temperature C []
readings é inicializado como uma lista vazia – cada nova instância recebe sua própria lista, não uma compartilhada. Qualquer coisa não atribuída a self é local a __init__ e desaparece quando ele retorna.